1

我想获取每个用户名在过去 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 回答 4

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
}

电源外壳 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
}
于 2013-02-01T20:17:26.507 回答
1

文件系统不会跟踪最近编辑文件的用户的身份,但它们会跟踪文件的所有者。如果您想按所有者查看最近修改文件的数量,可以尝试以下操作:

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

一点一点,这意味着:

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

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

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

    | sort | uniq -c
    
于 2013-02-01T19:37:07.710 回答
1

使用 PowerShell 3:

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

分解:

  1. 递归查找所有文件
  2. 通过使用日期/时间算法,仅使用小于 45 天的文件
  3. 获取安全描述符
  4. 按所有者属性分组,丢弃元素(我们只需要计数)
于 2013-02-21T07:28:13.243 回答
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 上创建的文件,这是不可避免的。

嗯!

于 2013-02-01T20:10:35.097 回答