Diferença entre find e grep -l

1

Se eu quiser listar arquivos por data contendo "foo" no nome do arquivo, posso fazer uma das seguintes opções: find . -name "*foo*" -exec ls -lrt {} \;
ls -lrt $(find . -name "*foo*")

Se eu quiser listar arquivos por data contendo "foo" dentro do próprio arquivo, só posso fazer ls -lrt $(grep -rl "foo")

Além disso, grep -l retorna uma lista de arquivos, por exemplo, file1 e file2 e file3
E a lista terá uma cor diferente da cor padrão

Onde find retorna uma lista, na cor padrão, como este% ./file1
./file2 e ./file3

Então, o que está acontecendo aqui? Qual a diferença entre os dois resultados, e porque não posso executar o resultado do grep?

    
por Tom 20.11.2012 / 20:37

1 resposta

2

Seus dois primeiros comandos propostos não são equivalentes. Se você usar find to -exec ls , o que acontece é que find executará ls uma vez para cada arquivo. A ordem de saída será a ordem encontrada por find , não ls . Como ls está sendo executado um arquivo por vez, ele não sabe como alinhar as colunas. Por exemplo, feito aqui no 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

Se você usar a substituição de comando, o shell colará a lista produzida por find de volta na linha de comando como argumentos para ls e, em seguida, executará ls exatamente uma vez na lista completa de arquivos e resultará de fato, ser ordenado por data, o mais novo primeiro.

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
    
por 20.11.2012 / 20:52