find 和 grep -l 之间的区别

find 和 grep -l 之间的区别

如果我想列出文件根据文件名中包含“foo”的日期,我可以执行以下任一操作
find . -name "*foo*" -exec ls -lrt {} \;
ls -lrt $(find . -name "*foo*")

如果我想列出文件根据文件本身包含“foo”的日期,我只能这样做
ls -lrt $(grep -rl "foo")

另外,grep -l返回文件列表,例如
file1
file2
file3
,列表的颜色将与默认颜色不同。

Wherasfind返回一个列表,采用默认颜色,如下所示
./file1
./file2
./file3

那么这里发生了什么? 这两个结果有什么区别? 为什么我无法执行 grep 的结果?

答案1

您提出的前两个命令并不等效。如果您使用find-exec ls则将为每个文件find运行ls一次。输出顺序将是 找到的顺序find,而不是ls。由于ls一次只运行一个文件,因此它不知道如何排列列。例如,在 Cygwin bash 中完成:

Nicole@NicoleDesktop ~/HamiltonCshell/Current/util
$ find . -name "s*.c" -exec ls -lrt {} \;
-rwx------+ 1 Nicole None 104826 Dec 29  2010 ./Archive/su.2010-12-29/su.c
-rwx------+ 1 Nicole None 107074 Aug  2  2011 ./Archive/su.2011-08-29/su.c
-rwx------+ 1 Nicole None 125359 Jul 17 11:47 ./sed.c
-rwx------+ 1 Nicole None 15517 Oct  6  2011 ./setrows.c
-rwx------+ 1 Nicole None 8454 Oct  8  2011 ./setwin.c
-rwx------+ 1 Nicole None 39007 Jan 24  2012 ./shortcut.c
-rwx------+ 1 Nicole None 4655 May 22  2009 ./showdesk.c
-rwx------+ 1 Nicole None 66906 Nov 20 09:58 ./sort.c
-rwx------+ 1 Nicole None 9702 May 22  2009 ./split.c
-rwx------+ 1 Nicole None 21306 May 22  2009 ./strings.c
-rwx------+ 1 Nicole None 113680 Jul 15 06:56 ./su.c
-rwx------+ 1 Nicole None 10076 May 23  2009 ./sum.c

如果您使用命令替换,shell 会将生成的列表粘贴find回命令行作为参数ls,然后它将ls在整个文件列表上运行一次,并且结果确实会按日期排序,最新的排在第一位。

Nicole@NicoleDesktop ~/HamiltonCshell/Current/util
$ ls -lt $(find . -name "s*.c")
-rwx------+ 1 Nicole None  66906 Nov 20 09:58 ./sort.c
-rwx------+ 1 Nicole None 125359 Jul 17 11:47 ./sed.c
-rwx------+ 1 Nicole None 113680 Jul 15 06:56 ./su.c
-rwx------+ 1 Nicole None  39007 Jan 24  2012 ./shortcut.c
-rwx------+ 1 Nicole None   8454 Oct  8  2011 ./setwin.c
-rwx------+ 1 Nicole None  15517 Oct  6  2011 ./setrows.c
-rwx------+ 1 Nicole None 107074 Aug  2  2011 ./Archive/su.2011-08-29/su.c
-rwx------+ 1 Nicole None 104826 Dec 29  2010 ./Archive/su.2010-12-29/su.c
-rwx------+ 1 Nicole None  10076 May 23  2009 ./sum.c
-rwx------+ 1 Nicole None  21306 May 22  2009 ./strings.c
-rwx------+ 1 Nicole None   9702 May 22  2009 ./split.c
-rwx------+ 1 Nicole None   4655 May 22  2009 ./showdesk.c

相关内容