2

如果我ls -l在一个目录中并得到:

-rwxr-x---  1 user1  admin        0  8 Aug  2012 file.txt
-rwxr-x---  1 user1  admin  1733480 26 Jul  2012 Archive.pax.gz
drwxr-x---@ 7 user1  admin      238 31 Jul  2012 Mac Shots
-rwxr-x---@ 1 user3  admin   598445 31 Jul  2012 Mac Shots.zip
-rwxr-x---@ 1 user1  admin      380  6 Jul  2012 an.sh
-rwxr-x---  1 user2  admin       14 30 Jun  2012 analystName.txt
-rwxr-x---  1 user1  admin       36  8 Aug  2012 apple.txt
drwxr-x---@ 7 user1  admin      238 31 Jul  2012 iPad Shots
-rwxr-x---@ 1 user1  admin  7372367 31 Jul  2012 iPad Shots.zip
-rwxr-x---  1 user2  admin      109 30 Jun  2012 test.txt
drwxr-x---  3 user1  admin      102 26 Jul  2012 usr

但只想列出“user1”拥有的文件,这些文件在“Aug”中被修改以获得

-rwxr-x---  1 user1  admin        0  8 Aug  2012 file.txt
-rwxr-x---  1 user1  admin       36  8 Aug  2012 apple.txt

最好的方法是什么?

4

4 回答 4

6

解析ls输出从来都不是一个好的可靠的解决方案。ls是一种交互式查看文件信息的工具。它的输出是为人类格式化的,并且会导致脚本中的错误。使用 glob 或 find 代替。了解原因: http: //mywiki.wooledge.org/ParsingLs

相反,您可以尝试:

find . -type f -user 'user1' -maxdepth 1

或者

find . -type f -printf '%u %f\n' -maxdepth 1 # if you want to show the username

或者

stat -c '%U %f' * | cut -d" " -f2-

man find
man stat
于 2013-02-08T00:03:29.000 回答
2

或者您可以更明确一点,因为 Michael 的 grep 还会找到 user1 拥有的名为“August iPad Shots”的文件,无论何时修改:

ls -l | awk '($3=="user1" && $7=="Aug")'
于 2013-02-08T00:01:53.337 回答
1

我认为最安全的方法是这样的:

touch --date "2012-08-01" /tmp/start
touch --date "2012-09-01" /tmp/stop
find . -maxdepth 1 -type f -user user1 -newer /tmp/start -not -newer /tmp/stop -print0 | xargs -0 ls -l {}
rm /tmp/start /tmp/stop

或作为一个班轮

touch --date "2012-08-01" /tmp/start; touch --date "2012-09-01" /tmp/stop; find . -maxdepth 1 -type f -user user1 -newer /tmp/start -not -newer /tmp/stop -print0 | xargs -0 ls -l {}; rm /tmp/start /tmp/stop

优点:

缺点

  • 有点长

解释:

  • -maxdepth 1:将结果限制在当前目录
  • -type f:将结果限制为文件
  • -user user1:将结果重新字符串到属于user1的文件
  • -newer /tmp/start:将结果重新字符串到比更新/tmp/start的文件,该文件是使用所需日期创建的
  • -not -newer /tmp/stop : 将结果重新字符串到晚于 的文件/tmp/stop,该文件是使用所需日期创建的
  • -print0:因此它可以处理名称中带有换行符的文件名!
于 2013-02-08T00:17:24.863 回答
0

怎么样ls -l | grep user1 | grep Aug

或者您可以结合正则表达式:ls -l | grep 'user1.*Aug'

于 2013-02-07T23:59:01.727 回答