Passer l'argument xargs en tant que string à une autre command avec '>'?

Supposons que j'ai un tas de files dans /tmp/ .

je fais

 find . -type f | xargs -iFILES 

Et je veux faire un md5sum dans chaque file, en sortant dans un file avec le même nom, mais avec l'extension .md5 .

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

Ceci est supposé créer un file md5 pour chaque file trouvé par la command find. Au lieu de cela, il crée un seul file FILES.md5 sur le disque avec des sums de contrôle de tous les files.

Comment dire à la command md5sum que les FICHIERS représentent le nom de file courant et non une string littérale FILES?

Vous avez besoin d'un moyen de dire que vous voulez envoyer la sortie de md5sum à un file. Étant donné que find (ou xargs ) ne dispose pas de cette fonctionnalité et que md5sum sait seulement imprimer en sortie standard, la redirection de shell est la méthode la plus simple.

Notez que votre command ne fonctionnera pas dans le cas général pour une autre raison: le format de sortie de find n'est pas le format d'input de xargs , ils diffèrent par des noms de files contenant des espaces blancs ou \"' .

 find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \; 

Vous devez utiliser un sous-shell pour gérer la redirection d'E / S:

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

Avec GNU Parallel, vous pouvez faire:

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

Vous obtenez l'avantage supplémentaire de l'exécution de md5sum en parallèle et que des files comme:

 My brother's 12" records.txt 

n'entraînera pas la panne de votre command. Regardez la video d'introduction pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ