Ordenar la salida de "buscar"?


77

Necesito poder ordenar alfabéticamente la salida de findantes de canalizarla a un comando. Entrar | sort |entre no funcionó, entonces, ¿qué podría hacer?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

Respuestas:


52

Use findcomo de costumbre y delimite sus líneas con NUL. GNU sortpuede manejar esto con el modificador -z:

find . -print0 | sort -z | xargs -r0 yourcommand

58

Algunas versiones de sorttienen una -zopción, que permite registros terminados en nulo.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Además, también podría escribir un script de alto nivel para hacerlo:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Agregue la -ropción para xargsasegurarse de que myCommandse llame con un argumento.


Buena (¿dos?) ... Curiosamente, sin embargo, los dos métodos se manejan de manera .diferente ... Con sortesto termina al final de la lista ... con el orden pythonen la parte superior. (tal vez Python se clasifica con LC_COLLATE=C)
Peter.O

También existe la -t \0opción de ordenar (que es -zsinónimo)
Javier

1
El problema con todas estas |sortsoluciones es que ya no puede usarlas -exec. OK, aunque es posible reescribir su declaración dada para -execque funcione xargs, la pregunta es, ¿qué pasa con los "mini-scripts" ? ( sh -c ...) No llamaría a eso trivial para transformar un mini script 'sh -c' con múltiples comandos para que pueda funcionar xargs(si es posible, es decir)
syntaxerror

@syntaxerror: ¿Qué problema tienes usando sh -c con xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Creo que necesitas la -nbandera para ordenar #

Según el tipo de hombre:

-n, --numeric-sort
    compare according to string numerical value

editar

El print0 puede tener algo que ver con esto, acabo de probar esto. Saque la print0, puede terminar nulo la cadena en orden usando la -zbandera


Bueno, eso print0parece estar separando el espacio de los nombres de archivo, que es lo que necesito pasar a mi comando, desafortunadamente
Industrial

1

Si tiene instalado GNU Parallel http://www.gnu.org/software/parallel/ , puede hacer esto:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

Puede instalar GNU Parallel simplemente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Mire los videos de introducción de GNU Parallel para obtener más información: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


¿Cuál es la justificación para usar GNU Parallel? Para acelerarlo?
Peter Mortensen

Eso y no necesita meterse con \ 0 registros separados.
Ole Tange
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.