La modification de chaîne de remplacement dans xargs

Quand je suis en utilisant xargs parfois je n'ai pas besoin d'utiliser explicitement le remplacement de la chaîne:

find . -name "*.txt" | xargs rm -rf

Dans d'autres cas, je tiens à préciser que le remplacement de la chaîne, pour faire des choses comme:

find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar

La commande précédente serait de déplacer tous les fichiers texte dans le répertoire courant dans /foo et il va ajouter l'extension bar à tous les fichiers.

Si au lieu d'ajouter du texte à la chaîne de remplacement, j'ai voulu modifier cette chaîne pour que je puisse insérer du texte entre le nom et l'extension des fichiers, comment pourrais-je le faire? Par exemple, disons que je veux faire la même chose que dans l'exemple précédent, mais les fichiers doivent être renommés/déplacé de <name>.txt à /foo/<name>.bar.txt (au lieu de /foo/<name>.txt.bar).

Mise à JOUR: j'ai réussi à trouver une solution:

find . -name "*.txt" | xargs -I{} \
    sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
           mv "$1" "foo/${name}.bar.${ext}"' -- {}

Mais je me demande si il y a un court/une meilleure solution.

  • Non, sauf que je voudrais utiliser plus citant mv "$1" "foo/${name}.bar.${ext}" et vous pourriez faire basename comme ceci: base=${1##*/}. Vous devriez poster votre solution comme une réponse et de l'accepter.
  • Merci pour votre commentaire! Je vais attendre un peu plus, juste pour voir si quelqu'un arrive avec un peu de fantaisie chose, sinon je vais répondre à la question moi-même.
  • Je pense que si votre nom de fichier est la dernière chose sur la ligne, vous n'avez pas besoin de l'-I{} ni {} dans la ligne de commande. (À noter que le but même de xargs est de groupe, si vous NE voulez PAS plusieurs choses à la fin de 1 xargs l'argument de l'invocation, vous avez besoin "-l 1" (ou-L 1 pour certaines versions de xargs). -I{} implique -l 1, donc c'est pour ça que fonctionne également ici).
  • Le sh -c a été la clé pour moi! Merci! D'autre ma coupe/sed commande en echo {}|sed '...' n'a pas été exécutée
InformationsquelleAutor betabandido | 2012-05-29