Come rinominare con prefisso / suffisso?
Domanda
Come posso mv original.filename new.original.filename
senza dover riscrivere il nome file originale?
Immagino di poter fare qualcosa come mv -p = new. original.filename
o forse mv original.filename nuovo. ~
o altro - ma non riesco a vedere nulla del genere dopo aver visto man mv
/ info mv
pagine
Certo, potrei scrivere uno script di shell per farlo, ma non esiste un comando / flag esistente per questo?
Soluzione
In Bash e zsh puoi farlo con Brace Expansion . Questo semplicemente espande un elenco di elementi tra parentesi graffe. Ad esempio:
# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream
Quindi puoi fare la tua ridenominazione come segue:
mv {,new.}original.filename
poiché questo si espande in:
mv original.filename new.original.filename
Altri suggerimenti
È possibile utilizzare il comando rename (1):
rename 's/(.*)$/new.$1/' original.filename
Modifica: se la ridenominazione non è disponibile e devi rinominare più di un file, lo script di shell può essere davvero breve e semplice per questo. Ad esempio, per rinominare tutti .jpg in prefisso_ .jpg nella directory corrente:
for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;
È possibile ottenere una ridenominazione di file multipli compatibile con unix (usando i caratteri jolly) creando un ciclo for:
for file in *; do
mv $file new.${file%%}
done
Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
#!/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 Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*> || -l Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>)
{
my($was) = Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>;
eval $op;
die $@ if $@;
next if ($was eq Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>);
if ($force == 0 && -f Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>)
{
print STDERR "rename failed: $was - Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*> exists\n";
}
else
{
print "+ $was --> Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*>));
}
}
else
{
print STDERR " Ho visto persone menzionare un comando rinomina
, ma non è di routine disponibile sui sistemi Unix (al contrario dei sistemi Linux, diciamo, o Cygwin - su entrambi i quali, rinominare è un eseguibile piuttosto che una sceneggiatura). Quella versione di rinomina
ha una funzionalità abbastanza limitata:
rename from to file ...
Sostituisce la da parte dei nomi dei file con in , e l'esempio fornito nella pagina man è:
rename foo foo0 foo? foo??
Rinomina foo1 in foo01 e foo10 in foo010, ecc.
Uso uno script Perl chiamato rename
, che ho originariamente estratto dal libro Camel della prima edizione, intorno al 1992, e poi esteso per rinominare i file.
<*>
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file.
Nell'esempio specifico richiesto, useresti:
<*> - $!\n";
}
}
Ciò consente di scrivere qualsiasi comando sostitutivo Perl o traslitterare il comando per mappare i nomi dei file. Nell'esempio specifico richiesto, useresti:
<*>Il modo più semplice per rinominare i file in blocco nella directory è:
ls | xargs -I fileName mv fileName fileName.suffix
Se è aperto a una modifica, è possibile utilizzare un suffisso anziché un prefisso. Quindi è possibile utilizzare il completamento con tabulazione per ottenere il nome file originale e aggiungere il suffisso.
Altrimenti, no, questo non è qualcosa che è supportato dal comando mv. Un semplice script di shell potrebbe farcela.
Nel mio caso ho un gruppo di file che deve essere rinominato prima di poter lavorare con loro. Ogni file ha il suo ruolo nel gruppo e ha il suo modello.
Come risultato ho un elenco di comandi di rinomina come questo:
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
Prova anche questo:
f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}
Questo produrrà tutte le combinazioni con prefissi e suffissi:
pref1.MyFileName.suf1
...
pref2.MyFileName.suf2
Un altro modo per risolvere lo stesso problema è creare un array di mappatura e aggiungere il prefisso corrispondente per ciascun tipo di file come mostrato di seguito:
#!/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
Bulk rename file 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