grep ls跨标签输出

时间:2013-02-07 23:56:07

标签: bash ls

如果我在目录中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 个答案:

答案 0 :(得分:6)

解析ls输出永远不是一个好的和可靠的解决方案。 ls是用于交互式查看文件信息的工具。它的输出格式化为人类,并将导致脚本中的错误。使用globs或代替。了解原因: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

答案 1 :(得分:2)

或者你可以更明确,因为Michael的grep也会发现user1拥有的文件名为'August iPad Shots',无论它何时被修改:

ls -l | awk '($3=="user1" && $7=="Aug")'

答案 2 :(得分: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

或作为 one liner

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 :将结果重新绑定到文件 not noter ,而不是使用所需日期创建的/tmp/stop
  • >
  • -print0 :所以它可以处理名称中带换行符的文件名!

答案 3 :(得分:0)

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

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