web-dev-qa-db-fra.com

"-bash: / usr / bin / rename: la liste d'arguments est trop longue"

Je voudrais renommer les fichiers de chaque sous-répertoire en ajoutant le nom du sous-répertoire. Suite à la réponse de Renommez les fichiers en ajoutant leur nom de dossier parent , j'ai essayé:

rename  's/(.*)\//$1\/$1_/' */*

Cependant, pour de nombreux sous-répertoires, cela ne fonctionne pas. J'ai 13 000 sous-répertoires contenant chacun environ 300 fichiers. Je reçois

-bash: /usr/bin/rename:  Argument list too long

J'ai essayé:

ls | xargs rename 's/(.*)\//$1\/$1_/' */*
find . -maxdepth 1 -type f -print0 | xargs rename 's/(.*)\//$1\/$1_/' */*

Les deux donnent la même erreur:

-bash: /usr/bin/xargs:  Argument list too long

EDIT

xargs -L  rename 's/(.*)\//$1\/$1_/' */*
xargs -L1  rename 's/(.*)\//$1\/$1_/' */*

Même erreur:

-bash: /usr/bin/xargs:  Argument list too long
4
Josselin

Comme @ egmont noté , donner les chemins (*/*) en tant qu'argument (s) à xargs est faux. Cette commande lit les noms de fichier à partir de l'entrée standard au lieu des arguments. Par conséquent, émettre xargs sans aucune entrée standard (la section EDIT de la question) est inutile.

Solution utilisant ls et xargs

Vérifiez si vous pouvez simplement ls tous les chemins en question.

ls */*

Si oui, vous pouvez utiliser une version corrigée de votre 2) option:

ls */* | xargs rename -n 's/(.*)\//$1\/$1_/'

Solution utilisant find

Si vous obtenez une erreur de l'appel ls, vous pouvez toujours utiliser find.

  1. Cette commande a une option -exec qui fonctionne de la même manière que xargs; nous n’aurons donc pas besoin de xargs dans ce cas.
  2. Pour reproduire le comportement de ls */*, utilisez les options -mindepth 2 -maxdepth 2.

La version corrigée de l'option 3) serait:

find . -mindepth 2 -maxdepth 2 -type f -exec rename -n 's/(.*)\//$1\/$1_/' {} \;

L'espace réservé aux arguments, associé à un point-virgule d'échappement ({} \;), garantit que rename est exécuté uniquement pour un seul fichier à la fois, de la même manière que xargs -L1. Cela évitera le problème initial avec trop de fichiers à la fois.

Essai à sec et renommer

Vous pouvez vérifier le résultat à l’aide de l’option -n que j’ai incluse après rename pour simplement répertorier les renames qu’elle ferait. Pour lancer réellement l'opération de changement de nom, supprimez l'option -n .

3
Melebius