Como posso direcionar uma entrada de canal para o comando ls?


20

Quando digito algo como:

find . -name *foo* | ls -lah

retorna o mesmo resultado que um lscomando simples , como se não tivesse entrada.

Contudo:

ls -lah $( find . -name *foo* )

funciona bem, mas somente quando o findcomando tem resultados.

É possível canalizar para ls?


Você precisa especificar se deseja os arquivos dentro de cada resultado da localização ou se deseja os resultados diretamente. Se for o último, a resposta de u / Dennis é a resposta correta.
rmutalik 10/12

Respostas:


27

Você pode usar -execcom o findcomando

find . -name '*foo*' -exec ls -lah {} \;

Obrigado pela sua solução. Não há cachimbo, mas é um método elegante. Se não houver nenhum resultado com 'find', ele não exibirá nada (o que é realmente bom).
Lasall

7
Uma maneira um pouco melhor:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

Isso deve funcionar.


11
Obrigado por essa solução. Mas como posso lidar com espaços em branco?
Lasall

2
@ Toda a maneira preferida é usar o find -exec +(ou -exec \;). xargssó é seguro usar com a -0opção, o que significa que você precisa informar qualquer comando que canalize xargspara delimitar os itens com bytes nulos (\ 0). Com findvocê pode fazer isso com -print0. xargs -0 e find's -print0 não são padrão, mas -exec é, portanto, se a portabilidade for um problema, use find com -exec.
Geirha 26/05


3

Use isto: (ls pode classificar, funciona com nomes de arquivos com espaços ou caracteres incomuns)

find . -name *foo* -print0 | xargs -0 ls -lah

"-print0" significa que os nomes de arquivos como file foo 1serão obtidos findseguidos por nulo. O argumento "-0" para xargs diz que ele espera esse tipo de entrada, para que os nomes de arquivos com espaços sejam canalizados lscorretamente para o comando.

A xargsconstrução é, de certa forma, melhor do que find etc -exec ls {} \;porque todos os nomes de arquivos são enviados de lsuma só vez; portanto, se você deseja classificá-los todos por carimbo de data / hora (usando ls), algo como isso funciona:

find . -iname *pdf -print0 | xargs -0 ls -ltr

Em um sistema NetBSD, "-printx" também é uma opção (isso me parece um argumento útil, mas seja o que for, temos xargs -0 e tudo bem):

find . -name *foo* -printx | xargs ls -lah (não para o Ubuntu)


Isso fez o truque para mim por ser capaz de realmente usar as funções de classificação de ls, para aqueles que tentam fazer isso.
Harry Mustoe-Playfair
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.