Renommer tous les fichiers d'un dossier avec un préfixe dans une seule commande unix
renommer tous les fichiers d'un dossier avec le préfixe" Unix_ " c'est-à-dire supposer qu'un dossier a deux fichiers a.txt et B. pdf, alors ils devraient tous les deux être renommés d'une commande unique à Unix_a.txt et Unix_b.pdf
8 réponses
si vos noms de fichiers contiennent no whitepace et que vous n'avez pas de sous-répertoires, vous pouvez utiliser une simple boucle for
:
$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done
sinon utilisez la commande pratique rename
(qui est un script perl) - bien qu'il puisse ne pas être disponible hors de la boîte sur chaque Unix (par exemple OS X ne vient pas avec rename
).
un bref aperçu à debian-administration.org:
si vos noms de fichiers contiennent des espaces, il est plus facile d'utiliser find
, sur Linux, ce qui suit devrait fonctionner:
$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh
sur les systèmes BSD, il n'y a pas d'option -printf
, malheureusement. Mais GNU findutils doit être installable (sur Mac OS X avec brew install findutils
).
$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh
essayez la rename
commande dans le dossier avec les fichiers :
rename 's/^/Unix_/' *
l'argument de rename ( sed s command ) indique de remplacer le regex ^ par Unix_ . L'accent circonflexe (^) est un caractère spécial qui signifie début de ligne .
je pense que c'est exactement ce que vous cherchez:
ls | xargs -I {} mv {} Unix_{}
Oui, il est simple, élégant et puissant, et alos oneline-comand de courese. Vous pouvez obtenir plus de détails intro de moi sur la page: renommer les fichiers et les répertoires (ajouter le préfixe)
j'ai récemment fait face à la même situation et j'ai trouvé une solution plus facile. Je le partage ici afin qu'il puisse aider d'autres personnes à la recherche de solution.
avec OS X Yosemite, Apple a intégré les capacités de renommage par lots directement dans Finder. Détails informations sont disponibles ici . J'ai aussi copié les étapes ci-dessous,
Renommer plusieurs éléments
-
sélectionnez les éléments, puis Contrôle-cliquez sur l'un d'eux.
-
dans le menu raccourci, sélectionnez Renommer Items.
-
dans le menu contextuel ci-dessous, renommez les éléments du dossier, choisissez de remplacer le texte dans les noms, ajoutez du texte aux noms, ou changez le format du nom.
-
texte que vous voulez ajouter dans le champ "Remplacer par".
-
Ajouter du texte: Saisissez le texte que vous souhaitez ajouter dans le champ, puis choisissez d'ajouter du texte avant ou après le nom actuel.
-
Format: choisissez un format de nom pour les fichiers, puis choisissez de mettre l'index, compteur, ou date avant ou après le nom. Entrez un nom dans le champ de format personnalisé, puis entrez le numéro avec lequel vous voulez commencer.
-
-
Cliquez Sur Renommer.
si vous avez un motif commun dans vos fichiers que vous pouvez utiliser remplacer le texte sinon ajouter du texte ferait également le travail.
vous pouvez simplement utiliser -i
au lieu de -I {}
ls | xargs -i mv {} unix_{}
Cela fonctionne aussi parfaitement.
-
ls
- liste tous les fichiers du répertoire -
xargs
- accepte tous les fichiers ligne par ligne en raison de la-i
option -
{}
est le placeholder pour tous les fichiers, nécessaire sixargs
reçoit plus de deux arguments en entrée
Utilisation de awk:
ls -lrt | grep '^-' | awk '{print "mv "" unix_"""}' | sh
fonctionne aussi pour les articles avec des espaces et ignore les répertoires
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
:
Nous avons certificate.key
certificate.crt
à l'intérieur /user/ssl/
nous voulons renommer tout ce qui commence par certificate
en certificate_OLD
nous sommes maintenant situés à l'intérieur de /user
D'abord, vous faites un dry run avec -n
:
rename -n "s/certificate/certificate_old/" ./ssl/*
Qui renvoie:
rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt)
rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)
vos fichiers seront inchangés il s'agit juste d'un essai.
Solution:
quand vous êtes satisfait du résultat du test, exécutez-le pour de vrai:
rename "s/certificate/certificate_OLD/" ./ssl/*
ce que cela signifie:
'renommer" s / SOMETHING / SOMETING_ELSE " PATH / FILES
Astuce:
si vous êtes déjà sur le chemin, exécutez-le comme ceci:
rename "s/certificate/certificate_OLD/" *
Ou si vous voulez le faire dans n'importe quel sous-répertoire avec ss
:
rename -n "s/certificat/certificate_old/" ./ss*/*
vous pouvez aussi faire:
rename -n "s/certi*/certificate_old/" ./ss*/*
qui renomme tout ce qui commence par certi
dans n'importe quel sous-répertoire commençant par ss
.
le ciel est La limite.
Jouer avec la regex et tester en AVANT avec -n
.
ATTENTION CELA VA MÊME RENOMMER LES NOMS DE DOSSIERS QUI CORRESPONDENT.
Mieux cd
dans le répertoire et le faire là.
UTILISEZ À VOTRE PROPRE RISQUE.