Utilizzando il rename
(prename
in alcuni casi) script che a volte viene installato con Perl, è possibile utilizzare le espressioni Perl per eseguire la ridenominazione. Lo script salta la ridenominazione se c'è una collisione di nomi.
Il comando seguente rinomina solo i file che hanno quattro o meno cifre seguite da un'estensione ".txt". Non rinomina i file che non sono strettamente conformi a tale modello. Non tronca i nomi composti da più di quattro cifre.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Alcuni esempi:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
Altre risposte fornite finora tenteranno di rinominare i file che non sono conformi al modello, produrre errori per i nomi di file che contengono caratteri non numerici, eseguire rinominazioni che producono collisioni di nomi, provare e fallire a rinominare i file che hanno spazi nei loro nomi e forse altri problemi.
Una riga:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
Come posso utilizzare grep per abbinare solo le righe che contengono \d.txt (IE 1 cifra, poi un punto, poi le lettere txt)?
grep -E '^[0-9]\.txt$'
Prova:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Cambia lo schema del nome file ([0-9]*.txt
) se necessario.
Una ridenominazione enumerata generica che non fa supposizioni sull'insieme iniziale di nomi di file:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Sullo stesso argomento:
- Script Bash per riempire i nomi dei file
- Estrai nome file ed estensione in bash
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done