web-dev-qa-db-fra.com

Utiliser le nom de fichier actuel ("{}") plusieurs fois dans "find -exec"?

De nombreuses sources disent que chaque instance de {} sera remplacée par le nom de fichier trouvé via find, mais lorsque j'essaie d'exécuter ce qui suit, je ne reçois qu'un fichier texte dont le nom est ".txt".

find /directory -name "*pattern*" -exec cut -f8 {} > {}.txt \;

L'objectif était de créer un fichier texte avec seulement la huitième colonne de chaque fichier trouvé, et chaque fichier texte sera nommé d'après son fichier parent. Quelque chose à propos de ce second ensemble de {} ne remplace pas le nom de fichier de chaque fichier trouvé.

27
user1757862

Pour remédier aux mises en garde mentionnées par William Pursell dans sa réponse, utilisez ce qui suit:

find /directory -name "*pattern*" -exec sh -c 'cut -f8 "$1" > "$1.txt"' x {} \;

Lorsque vous utilisez sh -c, il obtient les paramètres de position des arguments qui suivent la chaîne à exécuter. Le x supplémentaire remplit le $0, et le nom du fichier substitué deviendra $1.

Les guillemets doubles permettent que cela fonctionne correctement avec les noms de fichiers contenant des espaces et d'autres caractères spéciaux.

11
Barmar
find /directory -name "*pattern*" | xargs awk '{z=FILENAME".txt";print $8>z}'
1
Vijay