Hmm. @don_crissti já deu a resposta para grep em um comentário. Mas como você disse que não era realmente sobre grep
ou ls
, vou reescrever o comando em questão para não usar esses comandos.
O que eu acho que você quer é:
do-something-with $(produce-list-of-files)
onde a saída de um comando deve ser descartada como parâmetros da linha de comando para outro comando. Apenas acontece de ser um utilitário apenas para isso, é chamado xargs
(man page) .
Se os nomes dos arquivos forem "legais", poderíamos fazer apenas
produce-list-of-files | xargs do-something-with
Se os nomes dos arquivos puderem conter espaços, mas forem separados por novas linhas, precisamos informar xargs
para não dividir em qualquer espaço em branco, mas somente novas linhas:
produce-list-of-files | xargs -d '\n' do-something-with
Se os nomes dos arquivos também puderem conter novas linhas, a lista deve ser separada por NULs ('\ 0', byte com valor zero) e precisamos de um xargs
que ofereça suporte a isso. Pelo menos algumas versões de vários utilitários suportam arquivos de listagem separados por NULs em vez de novas linhas, há pelo menos find -print0
, sort -z
e grep -Z
nas versões GNU dessas ferramentas. Em xargs
, o sinalizador é --null
ou -0
. Então:
produce-list-of-files -0 | xargs -0 do-something-with
Um exemplo é executado com cat
e, bem, ls -l
:
$ touch "abba acdc" "foo bar" $'new\nline'
$ echo -en "abba acdcdo-something-with $(produce-list-of-files)
foo barproduce-list-of-files | xargs do-something-with
new\nlineproduce-list-of-files | xargs -d '\n' do-something-with
" > list
$ cat list | xargs -0 ls -l
-rw-r--r-- 1 itvirta itvirta 0 Aug 2 01:23 abba acdc
-rw-r--r-- 1 itvirta itvirta 0 Aug 2 01:23 foo bar
-rw-r--r-- 1 itvirta itvirta 0 Aug 2 01:23 new?line