it-swarm-eu.dev

Hromadné přejmenování, změna předpony

Jak mohu hromadně nahradit předponu pro mnoho souborů?

Mám spoustu souborů jako

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Chtěl bych je všechny změnit

  • CLConnectionContext.h
  • CLConnectionContext.m

Jak bych to udělal?

57
ErikTJ
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.

39
mrb

Ř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

59
carandraug

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
35
jw013

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 .m
  • n=CL -> K názvu souboru přidejte předponu CL
  • sed -e 's/^Test//' -> Odstraní předponu Test z názvu souboru
  • mv $a $n -> Provede přejmenování
4
Eric

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ů“).

3
Francesco Turco

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;
1
ErikTJ

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/) }' *
1
user1146332