Pomocí rename
(prename
v některých případech) skript, který je někdy instalován s Perlem, můžete k přejmenování použít výrazy Perl. Pokud dojde ke kolizi názvu, skript přejmenování přeskočí.
Níže uvedený příkaz přejmenuje pouze soubory, které mají čtyři nebo méně číslic následovaných příponou „.txt“. Nepřejmenovává soubory, které přesně neodpovídají tomuto vzoru. Nezkracuje názvy, které se skládají z více než čtyř číslic.
rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *
Několik příkladů:
Original Becomes
1.txt 0001.txt
02.txt 0002.txt
123.txt 0123.txt
00000.txt 00000.txt
1.23.txt 1.23.txt
Další odpovědi, které byly dosud uvedeny, se pokusí přejmenovat soubory, které neodpovídají vzoru, produkovat chyby v názvech souborů, které obsahují nečíselné znaky, provádět přejmenování, která způsobí kolize názvů, pokusit se a neúspěšně přejmenovat soubory, které mají v názvech mezery a případně další problémy.
One-liner:
ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv
Jak mohu použít grep k vyhledání pouze řádků, které obsahují \d.txt (IE 1 číslice, pak tečka, potom písmena txt)?
grep -E '^[0-9]\.txt$'
Zkuste:
for a in [0-9]*.txt; do
mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done
Změňte vzor názvu souboru ([0-9]*.txt
) podle potřeby.
Univerzální výčtové přejmenování, které nevytváří žádné předpoklady ohledně počáteční sady názvů souborů:
X=1;
for i in *.txt; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
Na stejné téma:
- Bash skript pro vyplnění názvů souborů
- Extrahujte název souboru a příponu v bash
for a in *.txt; do
b=$(printf %04d.txt ${a%.txt})
if [ $a != $b ]; then
mv $a $b
fi
done