web-dev-qa-db-fra.com

Comment renommer avec prefix / suffix?

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?

85
Peter Boughton

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
113
Dave Webb

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;
139
Simon Lehmann

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
24
A Muguro

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
10
Jonathan Leffler

Le moyen le plus simple de renommer en bloc les fichiers du répertoire est:

ls | xargs -I fileName mv fileName fileName.suffix
3
Brajan Elektro

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.

2
workmad3

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
1
Harkály Gergő

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
1
aprodan