Comment renommer avec prefix / suffix?
Question
Comment puis-je faire mv original.filename nouveau.original.fichier
sans retaper le nom de fichier d'origine?
J'imagine pouvoir faire quelque chose comme mv -p = new. original.filename
ou peut-être mv original.filename new. ~
ou peu importe - mais je ne peux plus rien voir de semblable après avoir regardé man mv
/ info mv
pages.
Bien sûr, je pourrais écrire un script shell pour le faire, mais n’y at-il pas une commande / un indicateur pour cela?
La solution
En bash et zsh, vous pouvez le faire avec Extension de brassée . Cela élargit simplement une liste d'éléments entre accolades. Par exemple:
# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream
Vous pouvez donc renommer votre projet comme suit:
mv {,new.}original.filename
car cela devient:
mv original.filename new.original.filename
Autres conseils
Vous pouvez utiliser la commande rename (1):
rename 's/(.*)$/new.$1/' original.filename
Modifier: si le changement de nom n'est pas disponible et que vous devez renommer plusieurs fichiers, les scripts de shell peuvent être courts et simples à cette fin. Par exemple, pour renommer tous les .jpg en préfixe _ .jpg dans le répertoire actuel:
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
Vous pouvez obtenir un renommage de plusieurs fichiers compatible Unix (en utilisant des caractères génériques) en créant une boucle for:
for file in *; do
mv $file new.${file%%}
done
J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command
use strict;
use Getopt::Std;
my(%opts);
my($usage) = "Usage: rename 's/^/new./' original.filename
[-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;
die $usage unless getopts('fnxV', \%opts);
if ($opts{V})
{
printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});
my($op) = shift;
die $usage unless defined $op;
if (!@ARGV) {
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV)
{
if (-e J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*> || -l J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>)
{
my($was) = J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>;
eval $op;
die $@ if $@;
next if ($was eq J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>);
if ($force == 0 && -f J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>)
{
print STDERR "rename failed: $was - J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*> exists\n";
}
else
{
print "+ $was --> J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*>));
}
}
else
{
print STDERR " J'ai déjà vu des personnes mentionner une commande rename
, mais elle n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, par exemple, ou Cygwin - sur lesquels le renom est un exécutable. plutôt qu'un script). Cette version de renommer
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie de des noms de fichiers par à , et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 à foo01 et foo10 à foo010, etc.
J'utilise un script Perl appelé rename
, que j'avais initialement extrait de la première édition de Camel Book, vers 1992, puis étendu pour renommer des fichiers.
<*>
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers.
Dans l'exemple spécifique demandé, vous utiliseriez:
<*> - $!\n";
}
}
Ceci vous permet d’écrire n’importe quelle commande de substitution ou de translittération de Perl pour mapper les noms de fichiers. Dans l'exemple spécifique demandé, vous utiliseriez:
<*>Le moyen le plus simple de renommer en bloc les fichiers du répertoire est:
ls | xargs -I fileName mv fileName fileName.suffix
Si une modification est possible, vous pouvez utiliser un suffixe au lieu d'un préfixe. Vous pouvez ensuite utiliser la complétion par tabulation pour obtenir le nom de fichier d'origine et ajouter le suffixe.
Sinon, non, ce n'est pas quelque chose qui est supporté par la commande mv. Un simple script shell pourrait cependant s’en sortir.
Dans mon cas, j'ai un groupe de fichiers qui doivent être renommés avant de pouvoir les utiliser. Chaque fichier a son propre rôle dans le groupe et a son propre modèle.
En conséquence, j'ai une liste de commandes de changement de nom comme celle-ci:
f=`ls *canctn[0-9]*` ; mv $f CNLC.$f
f=`ls *acustb[0-9]*` ; mv $f CATB.$f
f=`ls *accusgtb[0-9]*` ; mv $f CATB.$f
f=`ls *acus[0-9]*` ; mv $f CAUS.$f
Essayez aussi:
f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}
Ceci produira toutes les combinaisons avec des préfixes et des suffixes:
pref1.MyFileName.suf1
...
pref2.MyFileName.suf2
Une autre façon de résoudre le même problème consiste à créer un tableau de mappage et à ajouter le préfixe correspondant à chaque type de fichier, comme indiqué ci-dessous:
#!/bin/bash
unset masks
typeset -A masks
masks[ip[0-9]]=ip
masks[iaf_usg[0-9]]=ip_usg
masks[ipusg[0-9]]=ip_usg
...
for fileMask in ${!masks[*]};
do
registryEntry="${masks[$fileMask]}";
fileName=*${fileMask}*
[ -e ${fileName} ] && mv ${fileName} ${registryEntry}.${fileName}
done
Renommer en bloc les fichiers script bash
#!/bin/bash
# USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER
# USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_
# VERSION: 2016.03.05.
# COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/)
# check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming
if [ -z "$2" ]
then i=1;
else
i=$2;
fi
# counts the files to set leading zeros before number | max 1000 files
count=$(ls -l * | wc -l)
if [ $count -lt 10 ]
then zeros=1;
else
if [ $count -lt 100 ]
then zeros=2;
else
zeros=3
fi
fi
# rename script
for file in *
do
mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.})
let i="$i+1"
done