¿Cómo puedo dirigir una entrada de tubería al comando ls?


20

Cuando escribo algo como:

find . -name *foo* | ls -lah

devuelve el mismo resultado que un lscomando simple , como si no tuviera entrada.

Sin embargo:

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

funciona bien, pero solo cuando el findcomando tiene resultados.

¿Es posible canalizar ls?


Debe especificar si desea obtener los archivos dentro de cada resultado de búsqueda o si desea obtener los resultados de búsqueda directamente. Si es el último, entonces la respuesta de u / Dennis es la respuesta correcta.
rmutalik

Respuestas:


27

Se puede usar -execcon findcomando.

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

Gracias por tu solución. No hay tubería, pero es un método elegante. Si no se encuentran resultados con 'buscar', no muestra nada (lo que de hecho es bueno).
Lasall

77
Una forma ligeramente mejor:find . -name '*foo*' -exec ls -lah {} +
jlliagre

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

Eso debería funcionar.


1
Gracias por esa solución Pero, ¿cómo puedo lidiar con espacios en blanco?
Lasall

2
@Lasall la forma preferida es utilizar find's -exec +(o -exec \;). xargssolo es seguro de usar con la -0opción, lo que significa que tiene que decirle a cualquier comando que canalice xargspara delimitar los elementos con NULL-bytes (\ 0). Con findusted puede hacer eso con -print0. xargs's -0 y find's -print0 no son estándar, pero -exec sí lo es, por lo que si la portabilidad es un problema, use find con -exec.
geirha


3

Use esto: (ls puede ordenar, funciona con nombres de archivos con espacios o caracteres inusuales)

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

"-print0" significa que los nombres de archivo como file foo 1se obtendrán de findseguido de nulo. El argumento "-0" para xargs le dice que espere este tipo de entrada, por lo que los nombres de archivo con espacios se canalizan lscorrectamente al comando.

La xargsconstrucción es en algunos aspectos mejor que find etc -exec ls {} \;porque todos los nombres de archivo se envían a la lsvez, por lo que si desea ordenarlos por marca de tiempo (usando ls), algo como esto funciona:

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

En un sistema NetBSD, "-printx" también es una opción (esto me parece un argumento útil, pero lo que sea, tenemos xargs -0 y está bien):

find . -name *foo* -printx | xargs ls -lah (no para Ubuntu)


Esto me sirvió para poder usar las funciones de clasificación de ls, para aquellos que intentan hacer esto.
Harry Mustoe-Playfair
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.