Il y a plusieurs fichiers dans un répertoire qui commencent par un préfixe fgh
, par exemple:
fghfilea
fghfileb
fghfilec
Je veux les renommer tous pour commencer par un préfixe jkl
. Existe-t-il une seule commande pour le faire au lieu de renommer chaque fichier individuellement?
Réponses:
Il existe plusieurs façons, mais l'utilisation
rename
sera probablement la plus simple.En utilisant une version de
rename
:En utilisant une autre version de
rename
(identique à la réponse de Judy2K ):Vous devriez vérifier la page de manuel de votre plate-forme pour voir lequel des éléments ci-dessus s'applique.
la source
rename
vous connectez à un autre, puis vous montrez la syntaxe pour unixhelp.ed.ac.uk/CGI/man-cgi?rename est l'autrerename
semble être un script ou un utilitaire spécifique à Linux. Si vous vous souciez de la portabilité, veuillez continuer à utiliser lessed
boucles et ou un script Perl en ligne.brew install rename
sur OS X :)Voici comment
sed
etmv
peuvent être utilisés ensemble pour renommer:Selon le commentaire ci-dessous, si les noms de fichiers contiennent des espaces, les guillemets peuvent devoir entourer la sous-fonction qui renvoie le nom pour déplacer les fichiers vers:
la source
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Je suggère de prendre en considération les remarques de @DaveNelson.renommer peut ne pas être dans tous les systèmes. donc si vous ne l'avez pas, utilisez le shell de cet exemple dans le shell bash
la source
sed
commande n'est pas requise. Celui-ci est plus simple que la réponse de @ nik.sh
ou généralement dans d'autres shells.Utilisation de mmv :
la source
;
en conjonction avec#1
. exemple:mmv ";fgh*" "#1jkl#2"
Il existe de nombreuses façons de le faire (toutes ne fonctionneront pas sur tous les systèmes Unixy):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
Le § peut être remplacé par tout ce qui vous convient. Vous pouvez le faire
find -exec
aussi mais cela se comporte subtilement différemment sur de nombreux systèmes, donc j'évite généralement celafor f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Brut mais efficace comme on dit
rename 's/^fgh/jkl/' fgh*
Vraiment joli, mais le renommage n'est pas présent sur BSD, qui est le système afix le plus courant.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Si vous insistez pour utiliser Perl, mais qu'il n'y a pas de renommage sur votre système, vous pouvez utiliser ce monstre.
Certains d'entre eux sont un peu compliqués et la liste est loin d'être complète, mais vous trouverez ici ce que vous voulez pour à peu près tous les systèmes Unix.
la source
ls
sortie ne doit pas être analysée et / ou canaliséela source
Utilisation
find
,xargs
etsed
:C'est plus complexe que la solution de @ nik mais cela permet de renommer les fichiers récursivement. Par exemple, la structure,
serait transformé en cela,
La clé pour le faire fonctionner
xargs
est d' invoquer le shell à partir de xargs .la source
Pour installer le script de renommage Perl :
Il y a deux renoms comme mentionné dans les commentaires dans la réponse de Stephan202. Les distributions basées sur Debian ont renommé Perl . Les distributions Redhat / rpm ont le C renommé .
OS X n'en a pas installé par défaut (au moins en 10.8), ni Windows / Cygwin.
la source
Voici une façon de le faire en utilisant la ligne de commande Groovy:
la source
Sur Solaris, vous pouvez essayer:
la source
for file in $(find)
est fondamentalement défectueux et ne peut pas être corrigé avec des guillemets. Si lefind
rendement ,./file name with spaces
vous obtiendrez unefor
boucle sur./file
,name
,with
etspaces
et aucune quantité de cité dans la boucle contribuera (ou même nécessaire).la source
Ce script a fonctionné pour moi pour le renommage récursif avec des répertoires / noms de fichiers contenant éventuellement des espaces blancs:
Remarquez l'
sed
expression qui, dans cet exemple, remplace toutes les occurrences de;
with space. Celui-ci doit bien entendu être remplacé en fonction des besoins spécifiques.
la source
Utilisation des outils StringSolver (Windows & Linux bash) qui traitent par des exemples:
Il calcule d' abord un filtre basé sur des exemples , où l'entrée est le nom des fichiers et la sortie (ok et notok, chaînes arbitraires). Si le filtre avait l'option --auto ou était appelé seul après cette commande, il créerait respectivement un dossier
ok
et un dossiernotok
et leur enverrait des fichiers.Ensuite, en utilisant le filtre, la
mv
commande est un mouvement semi-automatique qui devient automatique avec le modificateur --auto. En utilisant le filtre précédent grâce à --filter, il trouve un mappage defghfilea
àjklfilea
puis l'applique sur tous les fichiers filtrés.Autres solutions unifilaires
Autres façons équivalentes de faire la même chose (chaque ligne est équivalente), vous pouvez donc choisir votre façon préférée de le faire.
Solution en plusieurs étapes
Pour rechercher soigneusement si les commandes fonctionnent correctement, vous pouvez taper ce qui suit:
et lorsque vous êtes certain que le filtre est bon, effectuez le premier mouvement:
Si vous souhaitez tester et utiliser le filtre précédent, tapez:
Si la transformation n'est pas celle que vous vouliez (par exemple, même si
mv --explain
vous voyez que quelque chose ne va pas), vous pouvez tapermv --clear
pour redémarrer le déplacement des fichiers, ou ajouter d'autres exemplesmv input1 input2
où input1 et input2 sont d'autres exemplesLorsque vous êtes confiant, tapez simplement
et voilà! Tout le changement de nom se fait à l'aide du filtre.
AVERTISSEMENT: Je suis co-auteur de ce travail réalisé à des fins académiques. Il pourrait également y avoir bientôt une fonctionnalité de production de bash.
la source
Il était beaucoup plus facile (sur mon Mac) de le faire dans Ruby. Voici 2 exemples:
la source
Utilisation de renamer :
Retirez le
--dry-run
drapeau une fois que vous êtes satisfait que la sortie semble correcte.la source
Ma version de renommer les fichiers de masse:
la source
Je recommanderais d'utiliser mon propre script, qui résout ce problème. Il a également des options pour changer l'encodage des noms de fichiers et pour convertir la combinaison de signes diacritiques en caractères précomposés, un problème que j'ai toujours lorsque je copie des fichiers depuis mon Mac.
la source
stale over time
Cela a fonctionné pour moi en utilisant regexp:
Je voulais que les fichiers soient renommés comme ceci:
en utilisant le [az | _] + 0 * ([0-9] +. ) regexp où ([0-9] +. ) est une sous-chaîne de groupe à utiliser dans la commande rename
Produit:
Un autre exemple:
Produit:
Attention, soyez prudent.
la source
J'ai écrit ce script pour rechercher tous les fichiers .mkv en renommant récursivement les fichiers trouvés en .avi. Vous pouvez le personnaliser selon vos besoins. J'ai ajouté d'autres choses telles que l'obtention du répertoire de fichiers, de l'extension, du nom de fichier à partir d'un chemin de fichier au cas où vous devriez vous référer à quelque chose à l'avenir.
la source
Un script générique pour exécuter une
sed
expression sur une liste de fichiers (combine lased
solution avec larename
solution ):Appelez en passant le script une
sed
expression, puis n'importe quelle liste de fichiers, comme une version derename
:la source
Vous pouvez également utiliser le script ci-dessous. il est très facile à exécuter sur le terminal ...
// Renommer plusieurs fichiers à la fois
Exemple:-
la source
Une autre extension de paramètre possible :
la source