Jak mohu hromadně nahradit předponu pro mnoho souborů?
Mám spoustu souborů jako
Chtěl bych je všechny změnit
Jak bych to udělal?
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
To používá substituci bash k odstranění prvních 6 znaků ze vstupního souboru pomocí cut
, připojí CL
k výsledku a uloží to do $newname
. Poté přejmenuje staré jméno na nové. To se provádí u každého souboru.
cut -c7-
určuje, že ze vstupu by měly být vráceny pouze znaky za indexem 7. 7-
je rozsah začínající indexem 7 bez konce; to znamená, až do konce řádku.
Dříve jsem použil cut -b7-
, ale -c
by měl být použit místo toho ke zpracování kódování znaků, které by mohlo mít více bytů na znak, jako je UTF-8.
Řekl bych, že nejjednodušší je použít příkaz rename
, který je běžný u mnoha distribucí Linuxu. Existují dvě běžné verze tohoto příkazu, takže zkontrolujte jeho manuálovou stránku a zjistěte, kterou máte:
## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *
## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *
Pokud chcete používat verzi z util-linux-ng v systému Debian, je k dispozici pod názvem rename.ul
Rozšíření parametrů Shell stačí pro takové jednoduché transformace. Substituce příkazů je méně účinná kvůli potřebě vytvářet další procesy (pro substituci samotných příkazů a cut
/sed
).
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
Zde je jeden způsob:
ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
ls *.{h,m}
-> Vyhledejte všechny soubory s příponou .h nebo .mn=CL
-> K názvu souboru přidejte předponu CLsed -e 's/^Test//'
-> Odstraní předponu Test z názvu souborumv $a $n
-> Provede přejmenováníMůžete zkusit:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
Viz man bash
(podrobnosti jsou uvedeny v části „Rozšíření parametrů“).
No, nebylo to tak těžké jako já.
$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
Pokud potřebujete něco více pozoruhodného, můžete to udělat
Perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *