web-dev-qa-db-fra.com

Trier la sortie de "trouver"?

J'ai besoin de pouvoir trier par ordre alphabétique la sortie de find avant de la rediriger vers une commande. Saisie de | sort | entre n'a pas fonctionné, alors que faire?

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

Utilisez find comme d'habitude et délimitez vos lignes avec NUL. GNU sort peut gérer cela avec le commutateur -z:

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

Certaines versions de sort ont un -z option, qui permet les enregistrements terminés par null.

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

De plus, vous pouvez également é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

Ajouter le -r option à xargs pour vous assurer que myCommand est appelé avec un argument.

62
Arcege

Je pense que vous avez besoin du -n indicateur pour le tri #

Selon l'homme:

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

modifier

Le print0 peut avoir quelque chose à voir avec ça, je viens de le tester. Supprimez print0, vous pouvez mettre fin à la chaîne en tri en utilisant le -z drapeau

5
whoami

Si vous avez GNU Parallel http://www.gnu.org/software/parallel/ installé, 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 pour GNU Parallèle pour en savoir plus: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

2
Ole Tange