Passer l'argument xargs sous forme de chaîne à une autre commande avec '>'?

9

Supposons que j'ai un tas de fichiers /tmp/.

je fais

find . -type f | xargs -iFILES

Et je veux faire un md5sumdans chaque fichier, sortir dans un fichier avec le même nom, mais avec une .md5extension.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Ceci est censé créer un fichier md5 pour chaque fichier trouvé par la commande find. Au lieu de cela, il crée un seul fichier FILES.md5 sur le disque avec des sommes de contrôle de tous les fichiers.

Comment dire à la commande md5sum que les FICHIERS représentent le nom de fichier actuel et non une chaîne littérale de FICHIERS?

Quelqu'un vous utilise toujours MS-DOS
la source

Réponses:

4

Vous avez besoin d'un moyen de dire que vous souhaitez envoyer la sortie de md5sumdans un fichier. Étant donné que find(ou xargs) n'a pas cette fonctionnalité intégrée et md5sumne sait imprimer que sur une sortie standard, une redirection de shell est le moyen le plus simple.

Notez que votre commande ne fonctionnera pas dans le cas général pour une autre raison: le format de sortie de findn'est pas le format d'entrée de xargs, ils diffèrent par les noms de fichiers contenant des espaces ou \"'. Utilisez find -execplutôt.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
Gilles 'SO- arrête d'être méchant'
la source
7

Vous devez utiliser un sous-shell pour gérer la redirection IO:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
jsbillings
la source
5

Avec GNU Parallel, vous pouvez faire:

find . -type f | parallel md5sum {} \> {}.md5

Vous obtenez l'avantage supplémentaire d'exécuter md5sum en parallèle et que des fichiers comme:

My brother's 12" records.txt

ne fera pas planter votre commande. Regardez la vidéo d'introduction pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
la source