Comment renommer avec le préfixe / suffixe?

Comment est-ce que je fais mv original.filename new.original.filename sans retaper le nom de fichier original?

J’imagine pouvoir faire quelque chose comme mv -p=new. original.filename mv -p=new. original.filename ou peut-être mv original.filename new.~ ou autre chose – mais je ne vois rien de tel après avoir man mv / info mv pages.

Bien sûr, je pourrais écrire un script shell pour ce faire, mais n’y a-t-il pas une commande / un indicateur existant pour cela?

    Dans Bash et zsh, vous pouvez le faire avec Brace Expansion . Cela développe 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 

    Ainsi, vous pouvez 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 rename n’est pas disponible et que vous devez renommer plusieurs fichiers, le script shell peut être très simple et rapide. Par exemple, pour renommer tous les .jpg en prefix_ .jpg dans le répertoire en cours:

     for filename in *.jpg; do mv "$filename" "prefix_$filename"; done; 

    Vous pouvez obtenir un renommage de fichiers multiples 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 de rename , mais elle n’est pas systématiquement disponible sur les systèmes Unix (par opposition aux systèmes Linux, par exemple, ou à Cygwin). 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 des noms de fichiers par le à , et l’exemple donné dans la page de manuel est le suivant:

     rename foo foo0 foo? foo?? 

    Cela renomme foo1 en foo01, et foo10 en foo010, etc.

    J’utilise un script Perl appelé rename , que j’ai d’abord extrait de la première édition du livre Camel, vers 1992, puis étendu, pour renommer les 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 ssortingct; 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 = ; 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 une commande de substitution ou de translittération Perl pour mapper des noms de fichiers. Dans l’exemple spécifique demandé, vous utiliseriez:

     rename 's/^/new./' original.filename 

    S’il est ouvert à une modification, vous pouvez utiliser un suffixe plutôt qu’un préfixe. Ensuite, vous pouvez utiliser la complétion par tabulation pour obtenir le nom de fichier d’origine et append le suffixe.

    Sinon, ce n’est pas quelque chose qui est supporté par la commande mv. Un script shell simple pourrait cependant faire face.

    Dans mon cas, j’ai un groupe de fichiers qui doit être renommé avant de pouvoir travailler avec eux. 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 renommage comme ceci:

     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 ceci:

     f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2} 

    Cela 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 à append un 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 gros 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