Comment fais-je mv original.filename new.original.filename
sans retaper le nom du fichier original?
J'imagine pouvoir faire quelque chose comme mv -p=new. original.filename
ou peut-être mv original.filename new.~
ou quoi que ce soit - mais je ne peux rien voir de tel 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?
Dans Bash et zsh, vous pouvez le faire avec Expansion de l'accolade . Cela étend 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
Pour que vous puissiez renommer comme suit:
mv {,new.}original.filename
comme cela se développe à:
mv original.filename new.original.filename
Vous pouvez utiliser la commande rename (1):
rename 's/(.*)$/new.$1/' original.filename
Edit: Si le changement de nom n'est pas disponible et que vous devez renommer plus d'un fichier, les scripts Shell peuvent vraiment être simples et courts pour cela. Par exemple, pour renommer tous . Jpg en préfixe _ . Jpg dans le répertoire en cours:
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
Vous pouvez obtenir un changement de nom de fichier multiple 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 vu des gens mentionner une commande rename
, mais celle-ci n'est pas systématiquement disponible sur les systèmes Unix (contrairement aux systèmes Linux, disons ou à Cygwin, pour lesquels renommer est un exécutable plutôt qu'un script). . Cette version de rename
a une fonctionnalité assez limitée:
rename from to file ...
Il remplace la partie from des noms de fichiers par to, et l'exemple donné dans la page de manuel est le suivant:
rename foo foo0 foo? foo??
Ceci renomme foo1 en foo01, et foo10 en foo010, etc.
J'utilise un script Perl appelé rename
que j'avais initialement extrait de la première édition du livre Camel, circa 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: $0 [-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 $_ || -l $_)
{
my($was) = $_;
eval $op;
die $@ if $@;
next if ($was eq $_);
if ($force == 0 && -f $_)
{
print STDERR "rename failed: $was - $_ exists\n";
}
else
{
print "+ $was --> $_\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, $_));
}
}
else
{
print STDERR "$_ - $!\n";
}
}
Cela 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:
rename 's/^/new./' original.filename
Le moyen le plus simple de renommer en bloc les fichiers du répertoire est:
ls | xargs -I fileName mv fileName fileName.suffix
S'il est ouvert à une modification, vous pouvez utiliser un suffixe au lieu d'un préfixe. Ensuite, vous pouvez 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 faire face.
Renommer en masse les fichiers bash script
#!/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
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 ceci aussi:
f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}
Cela produira toutes les combinaisons avec préfixes et suffixes:
pref1.MyFileName.suf1
...
pref2.MyFileName.suf2
Un autre moyen 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