Ordinamento dell'output di "trova"?


77

Devo essere in grado di ordinare alfabeticamente l'output di findprima di inviarlo a un comando. L'inserimento | sort |tra non ha funzionato, quindi cosa avrei potuto fare?

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

Risposte:


52

Usa findcome al solito e delimita le tue linee con NUL. GNU sortpuò gestirli con l'opzione -z:

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

58

Alcune versioni di sorthanno -zun'opzione, che consente record con terminazione null.

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

Inoltre, puoi anche scrivere uno script di alto livello per farlo:

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

Aggiungi l' -ropzione a xargsper assicurarti che myCommandvenga chiamato con un argomento.


Uno buono (due?) ... È interessante notare, però, che i due metodi gestiscono in modo .diverso ... Con sortesso finisce alla fine della lista ... con pythonuna specie verso l'alto. (forse una specie di pitone con LC_COLLATE=C)
Peter

C'è anche l' -t \0opzione per l'ordinamento (che è un -zsinonimo)
Javier

1
Il problema con tutte queste |sortsoluzioni è che non puoi più utilizzarlo -exec. OK, anche se è possibile riscrivere la tua dichiarazione in -execmodo che funzioni xargs, la domanda è: che dire di "mini-script" ? ( sh -c ...) Non lo definirei banale per trasformare un mini-script "sh -c" con più comandi in modo che possa funzionare xargs(se possibile, cioè)
syntaxerror

@syntaxerror: Che problema hai 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

Penso che tu abbia bisogno della -nbandiera per ordinare #

Secondo la specie umana:

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

modificare

Print0 potrebbe avere qualcosa a che fare con questo, l'ho appena provato. Elimina print0, puoi annullare la stringa in ordine usando il -zflag


Bene, questo print0sembra separare lo spazio dei nomi dei file, che è quello che devo passare al mio comando, sfortunatamente
Industrial

1

Se hai installato GNU Parallel http://www.gnu.org/software/parallel/ puoi farlo:

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

Puoi installare GNU Parallel semplicemente:

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

Guarda i video introduttivi di GNU Parallel per saperne di più: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Qual è la giustificazione per l'utilizzo di GNU Parallel? Per accelerarlo?
Peter Mortensen,

Quello e non è necessario pasticciare con \ 0 record separati.
Ole Tange,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.