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
Industrial
fuente

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
Oli
fuente
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.

Arcege
fuente
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

quién soy
fuente
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

Ole Tange
fuente
¿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