获取每个用户名的最后一个修饰符的文件数量

时间:2013-02-01 18:55:03

标签: bash powershell filesystems window cygwin

我想获得过去45天内整个目录结构中他们编辑的文件数量(是编辑该文件的最后一位用户)的每个用户名的计数。

这是我想要的输出:

+-------+-----+
| alex  |   3 |
| liza  | 345 |
| harry | 564 |
| sally |  23 |
+-------+-----+

到目前为止,我有这个powershell非工作脚本:

gci -Recurse| where {$_.LastWriteTime -gt (Get-Date).AddDays(-45)}| group owner|select count,owner

解决方案可以是powershell或bash!

感谢您的指导。

在我看来,这个过程应该是:

  1. 获取过去45天内修改过的所有文件的列表
  2. 获取最近修改过该文件的所有用户名
  3. 按用户名
  4. 进行分组

4 个答案:

答案 0 :(得分:2)

powershell方式:

gci -Recurse| where {$_.LastWriteTime -gt (Get-Date).AddDays(-45)}| 
 select @{n="Owner";e={ get-acl $_ | select -expa owner }} | select -expa owner | group  | select Count,name

编辑最后评论(powershell 3.0):

$dirs = dir -Directory

foreach ( $dir in $dirs)
{      
 $a = dir $dir -r -File  |  select @{n="Owner";e={ get-acl $_.fullname | 
 select -expa owner }} | select -expa owner | group  | select Count,name

 $a | add-member -Name Path -MemberType NoteProperty -Value $dir -PassThru
}

powershell 2.0:

$dirs = dir | ? { $_.psiscontainer }
foreach ( $dir in $dirs)
{

 #$dir

 $a = dir $dir -r |? { -not $_.psiscontainer } |  select @{n="Owner";e={ get-acl $_.fullname | select -expa owner }} | select -expa owner | group  | select Count,name

 $a | add-member -Name Path -MemberType NoteProperty -Value $dir -PassThru
}

答案 1 :(得分:1)

文件系统不会跟踪编辑文件的最新用户的身份,但他们会跟踪文件的所有者。如果您想查看所有者最近修改过的文件的数量,可以试试这个:

find . -not -mtime +45 -printf %u\\n | sort | uniq -c

一块一块,这意味着:

  • 查找45天或更久前未修改的所有文件:

    find . -not -mtime +45
    
  • 对于每个文件,打印文件的所有者:

    -printf %u\\n
    
  • 对结果进行分组并计算:

    | sort | uniq -c
    

答案 2 :(得分:1)

使用PowerShell 3:

ls -r | ? LastAccessTime -gt (get-date).AddDays(-45) | get-acl | group Owner -no

细分:

  1. 递归查找所有文件
  2. 使用日期/时间算法
  3. 仅使用45天以下的文件
  4. 获取安全描述符
  5. 由所有者属性分组,丢弃元素(我们只需要计数)

答案 3 :(得分:0)

这是一个非常基本的脚本,可以帮助您实现目标:

$ cat findfilesbyuser.sh
#!/usr/bin/bash

searchdir="$1"
filelist=`find "$searchdir" -maxdepth 1 -type f -printf "%u:%p\n"`
userlist=`echo "$filelist" | cut -d: -f1 | sort -u`

echo "username:filecount"

while read uname
 do
  userfilecount=`grep -c "^"$uname":" <<< "$filelist"`
  echo "$uname:$userfilecount"
 done <<< "$userlist"

这里是我如何称呼它及其输出:

$ ./findfilesbyuser.sh /cygdrive/h
username:filecount
Administrators:1
user01:13
user02:24

你可能会遇到一些问题,cygwin会将一些用户名称显示为??????,但不幸的是,如果您使用bash解决方案扫描在Windows上创建的文件,这是不可避免的。

HTH!