Tri de la sortie de "trouver"?


77

Je dois être capable de trier par ordre alphabétique le résultat findavant de le diriger vers une commande. Entrer | sort |entre n'a pas fonctionné, alors que pourrais-je faire?

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

Réponses:


52

Utilisez findcomme d'habitude et délimitez vos lignes avec NUL. GNU sortpeut les gérer avec le commutateur -z:

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

58

Certaines versions de sortont une -zoption, qui autorise les enregistrements à terminaison nulle.

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

De plus, vous pouvez aussi écrire un script de haut niveau pour le faire:

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

Ajoutez l' -roption à xargspour vous assurer qu'il myCommandest appelé avec un argument.


Bon un (deux?) ... Fait intéressant, cependant, les deux méthodes gèrent .différemment ... sortCela finit à la fin de la liste ... avec pythonle classement au début. (Peut-être que python fait le LC_COLLATE=C
tri

Il existe également une -t \0option de tri ( -zsynonyme)
Javier

1
Le problème avec toutes ces |sortsolutions est que vous ne pouvez plus utiliser -exec. OK, bien qu'il soit possible de réécrire votre déclaration -execafin qu'elle fonctionne avec xargs, la question est, qu'en est-il des "mini-scripts" ? ( sh -c ...) Je n'appellerais pas cela trivial de transformer un mini-script 'sh -c' avec plusieurs commandes afin qu'il puisse fonctionner xargs(si possible, c'est-à-dire)
erreur de syntaxe

@syntaxerror: Quel problème avez-vous avec sh -c avec xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Je pense que vous avez besoin du -ndrapeau pour trier #

Selon le genre d'homme:

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

modifier

Le print0 peut avoir quelque chose à voir avec cela, je viens de tester cela. Prenez le print0, vous pouvez mettre fin à la chaîne en triant en utilisant l' -zindicateur


Eh bien, cela print0semble séparer les noms de fichiers d’un espace, c’est ce que j’ai besoin de transmettre à ma commande, malheureusement
Industrial

2

Si vous avez installé GNU Parallel http://www.gnu.org/software/parallel/, vous pouvez le faire:

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

Vous pouvez installer GNU Parallel simplement en:

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

Regardez les vidéos d'introduction à GNU Parallel pour en savoir plus: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Quelle est la justification d'utiliser GNU Parallel? Pour accélérer?
Peter Mortensen

Cela et vous n’avez pas besoin de jouer avec \ 0 enregistrements séparés.
Ole Tange
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.