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
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.
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_/'
find
Si vous obtenez une erreur de l'appel ls
, vous pouvez toujours utiliser find
.
-exec
qui fonctionne de la même manière que xargs
; nous n’aurons donc pas besoin de xargs
dans ce cas.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.
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
.