1

Если я хочу перечислить файлы по дате, содержащие "foo" в имени файла, я могу сделать одно из следующих
find . -name "*foo*" -exec ls -lrt {} \;
ls -lrt $(find . -name "*foo*")

Если я хочу перечислить файлы по дате, содержащие "foo" внутри самого файла, я могу сделать только
ls -lrt $(grep -rl "foo")

Кроме того, grep -l возвращает список файлов, например
file1
file2
file3
И список будет другого цвета, чем цвет по умолчанию

Когда команда find возвращает список в цвете по умолчанию, например
./file1
./file2
./file3

Так что здесь происходит? В чем разница между этими двумя результатами, и почему я не могу выполнить результат из grep?

1 ответ1

2

Ваши первые две предложенные команды не эквивалентны. Если вы используете find to -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

Если вы используете подстановку команд, оболочка вставит список, созданный функцией 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .