Jak używać polecenia zmiany nazwy w systemie Linux

Zapoznaj się z potęgą zmiany nazw plików w świecie Linuksa i daj mv – i sobie – odpocząć. Zmiana nazwy jest elastyczna, szybka, a czasem nawet łatwiejsza. Oto samouczek dotyczący tego potężnego polecenia.

Co jest nie tak z mv?

Nie ma nic złego w mv. Polecenie tak dobra robota, i można go znaleźć we wszystkich dystrybucjach Linuksa, w systemie macOS i innych systemach operacyjnych typu Unix. Więc jest zawsze dostępny. Ale czasami potrzebujesz tylko buldożera, a nie łopaty.

Polecenie mv ma w życiu cel, a jest nim przenoszenie plików. To szczęśliwy efekt uboczny, że można go użyć do przeniesienia istniejącego pliku do nowego pliku z nową nazwą. Efektem netto jest zmiana nazwy pliku, więc otrzymujemy to, czego chcemy. Ale mv nie jest dedykowanym narzędziem do zmiany nazwy plików.

Zmiana nazwy pojedynczego pliku za pomocą mv

Aby użyć mv do zmiany nazwy typu pliku mv, spacji, nazwy pliku, spacji i nowej nazwy, jaką ma mieć plik. Następnie naciśnij Enter.

Możesz użyć ls, aby sprawdzić, czy nazwa pliku została zmieniona.

mv oldfile.txt newfile.txt
ls *.txt

mv oldfile.txt newfile.txt w oknie terminala

Zmiana nazwy wielu plików za pomocą mv

Sprawy stają się trudniejsze, gdy chcesz zmienić nazwę wielu plików. mv nie ma możliwości zmiany nazwy wielu plików. Musisz uciec się do sprytnych sztuczek Bash. To dobrze, jeśli znasz jakieś średniej klasy fu wiersza poleceń, ale złożoność zmiany nazwy wielu plików za pomocą mv stoi w jaskrawym kontraście z łatwością używania mv do zmiany nazwy pojedynczego pliku.

Sprawy szybko się nasilają.

Powiedzmy, że mamy katalog z różnymi plikami różnych typów. Niektóre z tych plików mają rozszerzenie „.prog”. Chcemy zmienić ich nazwy w wierszu poleceń, tak aby miały rozszerzenie „.prg”.

Jak zmusimy mv do zrobienia tego za nas? Rzućmy okiem na pliki.

ls *.prog -l

ls * .prog -l w oknie terminala

Oto jeden ze sposobów, który nie polega na pisaniu rzeczywistego pliku skryptu Bash.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

dla f in * .prog;  do mv -

Czy to działa? Sprawdźmy pliki i zobaczmy.

ls *.pr*

ls * .pr * w oknie terminala

Więc tak, zadziałało. Teraz wszystkie są plikami „.prg” i nie ma plików „.prog” w katalogu.

Co się stało?

Co właściwie zrobiło to długie polecenie? Rozbijmy to.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

Pierwsza część uruchamia pętlę, która po kolei będzie przetwarzać każdy plik „.prog” w katalogu.

Następna część mówi, co zrobi przetwarzanie. Używa mv do przenoszenia każdego pliku do nowego pliku. Nowy plik zostanie nazwany oryginalną nazwą pliku z wyłączeniem części „.prog”. Zamiast tego zostanie użyte nowe rozszerzenie „.prg”.

Musi być prostszy sposób

Z całą pewnością. To jest polecenie zmiany nazwy.

zmiana nazwy nie jest częścią standardowej dystrybucji Linuksa, więc musisz ją zainstalować. Ma też inną nazwę w różnych rodzinach Linuksa, ale wszystkie działają w ten sam sposób. Będziesz musiał tylko zastąpić odpowiednią nazwę polecenia zgodnie ze smakiem Linuksa, którego używasz.

w dystrybucjach opartych na Ubuntu i Debian instalujesz zmianę nazwy w następujący sposób:

sudo apt-get install rename

sudo apt-get install rename w oknie terminala

W dystrybucjach wywodzących się z Fedory i RedHat instalujesz nazwę wstępną w ten sposób. Zwróć uwagę na początkowe „p”, które oznacza Perl.

sudo dnf install prename

sudo dnf install prename w oknie terminala

Aby zainstalować go w Manjaro Linux, użyj następującego polecenia. Zauważ, że polecenie zmiany nazwy nazywa się perl-rename.

sudo pacman -Syu perl-rename

sudo pacman -Syu perl-rename w oknie terminala

Zróbmy to jeszcze raz

I tym razem użyjemy zmiany nazwy. Cofniemy zegar, aby mieć zestaw plików „.prog”.

ls *.prog

ls * .prog w oknie terminala

Teraz użyjmy następującego polecenia, aby zmienić ich nazwę. Następnie sprawdzimy u ls, czy zadziałało. Pamiętaj, aby zastąpić zmianę nazwy odpowiednią nazwą polecenia dla systemu Linux, jeśli nie używasz systemu Ubuntu lub Linuksa wywodzącego się z Debiana.

rename 's/.prog/.prg/' *.prog
ls *.pr*

zmień nazwę 's / .prog / .prg /' * .prog w oknie terminala

To zadziałało, teraz wszystkie są plikami „.prg” i nie ma żadnych plików „.prog” w katalogu.

Co się stało w tym czasie?

Wyjaśnijmy ten kawałek magii w trzech częściach.

Pierwsza część to nazwa polecenia, rename (lub prename lub perl-rename, dla innych dystrybucji).

Ostatnią częścią jest * .prog, który mówi rename, aby działała na wszystkich plikach „.prog”.

Środkowa część określa pracę, jaką chcemy wykonać na każdej nazwie pliku. S oznacza substytut. Pierwszy termin (.prog) jest tym, co funkcja rename będzie szukać w każdej nazwie pliku, a drugi termin (.prg) jest tym, czym zostanie zastąpiony.

Środkowa część polecenia lub centralne wyrażenie to Perl ’Wyrażenie regularne’i to właśnie nadaje poleceniu zmiany nazwy jego elastyczność.

Zmiana innych części nazwy pliku

Do tej pory zmieniliśmy rozszerzenia nazw plików, poprawmy inne części nazw plików.

W katalogu jest dużo plików z kodem źródłowym C. Wszystkie nazwy plików są poprzedzone przedrostkiem „slang_”. Możemy to sprawdzić za pomocą ls.

ls sl*.c

ls sl * .c w oknie terminala

Zamierzamy zastąpić wszystkie wystąpienia „slang_” przez „sl_”. Format polecenia jest nam już znany. Zmieniamy tylko wyszukiwany termin, termin zastępujący i typ pliku.

rename 's/slang_/sl_' *.c

zmień nazwę 's / slang_ / sl_' * .c w oknie terminala

Tym razem szukamy plików „.c”, a szukamy „slang_”. Za każdym razem, gdy w nazwie pliku zostanie znalezione słowo „slang_”, jest ono zastępowane przez „sl_”.

Możemy sprawdzić wynik tego polecenia, powtarzając polecenie ls z góry z tymi samymi parametrami:

ls sl*.c

ls sl * .c w oknie terminala

Usuwanie części nazwy pliku

Możemy usunąć część nazwy pliku, zastępując wyszukiwane hasło niczym.

ls *.c
rename 's/sl_//' *.c
ls *.c

zmień nazwę 's / sl _ //' * .c w oknie terminala

Z polecenia ls widzimy, że wszystkie nasze pliki „.c” są poprzedzone „sl_”. Pozbądźmy się tego całkowicie.

Polecenie zmiany nazwy ma taki sam format jak poprzednio. Będziemy szukać plików „.c”. Wyszukiwane hasło to „sl_”, ale nie ma terminu do zastąpienia. Dwa odwrócone ukośniki bez niczego między nimi nic nie znaczą, pusty ciąg.

rename przetworzy po kolei każdy plik „.c”. Wyszuka „sl_” w nazwie pliku. Jeśli zostanie znaleziony, nic go nie zastąpi. Innymi słowy, wyszukiwane hasło jest usuwane.

Drugie użycie polecenia ls potwierdza, że ​​przedrostek „sl_” został usunięty z każdego pliku „.c”.

Ogranicz zmiany do określonych części nazw plików

Użyjmy ls, aby przyjrzeć się plikom, które mają w nazwie ciąg „param”. Następnie użyjemy zmiany nazwy, aby zastąpić ten ciąg ciągiem „parametr”. Użyjemy ls jeszcze raz, aby zobaczyć wpływ polecenia zmiany nazwy na te pliki.

ls *param*
rename 's/param/parameter' *.c
ls *param*

zmień nazwę 's / param / parameter' * .c w oknie terminala

Znaleziono cztery pliki, które mają w nazwie „param”. param.c, param_one.c i param_two.c mają „param” na początku nazwy. nazwa third_param.c ma „param” na końcu swojej nazwy, tuż przed rozszerzeniem.

Polecenie rename wyszuka „parametr” w każdym miejscu nazwy pliku i zastąpi go słowem „parametr” we wszystkich przypadkach.

Drugie użycie polecenia ls pokazuje nam, że dokładnie tak się stało. Niezależnie od tego, czy „parametr” znajdował się na początku, czy na końcu nazwy pliku, został zastąpiony przez „parametr”.

Możemy użyć metaznaków Perla, aby udoskonalić zachowanie środkowego wyrażenia. Metaznaki to symbole reprezentujące pozycje lub sekwencje znaków. Na przykład, ^ oznacza „początek ciągu”, $ oznacza „koniec łańcucha”, a. oznacza dowolny pojedynczy znak (oprócz znaku nowej linii).

Zamierzamy użyć metaznaku początku łańcucha (^), aby ograniczyć nasze wyszukiwanie do początku nazw plików.

ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

zmień nazwę 's / ^ parametru / wartość /' * .c w oknie terminala

Pliki, których nazwy zmieniliśmy wcześniej, są wymienione i widzimy, że ciąg „parametr” znajduje się na początku trzech nazw plików i na końcu jednej z nazw plików.

Nasze polecenie zmiany nazwy używa metaznaku początku wiersza (^) przed wyszukiwanym hasłem „parametr”. Mówi to funkcji rename, aby traktowała wyszukiwany termin tylko wtedy, gdy znajduje się na początku nazwy pliku. Ciąg wyszukiwania „parametr” zostanie zignorowany, jeśli znajduje się w innym miejscu w nazwie pliku.

Sprawdzając za pomocą ls, widzimy, że nazwa pliku, która miała „parametr” na końcu nazwy pliku, nie została zmodyfikowana, ale trzy nazwy plików, które miały „parametr” na początku ich nazw, miały ciąg wyszukiwania zastąpiony przez substytut termin „wartość”.

Siła zmiany nazwy leży w sile Perla. Wszystkie z tych moc Perla jest do Twojej dyspozycji.

Wyszukiwanie za pomocą grupowań

rename ma jeszcze więcej sztuczek w rękawie. Rozważmy przypadek, w którym możesz mieć pliki z podobnymi ciągami w nazwie. Nie są dokładnie tymi samymi łańcuchami, więc proste wyszukiwanie i podstawianie nie zadziała.

W tym przykładzie używamy ls do sprawdzenia, które pliki zaczynamy od „str”. Jest ich dwa, string.c i strangle.c. Możemy zmienić nazwę obu ciągów jednocześnie, używając techniki zwanej grupowaniem.

Centralne wyrażenie tego polecenia zmiany nazwy będzie szukać ciągów w nazwach plików, które mają sekwencję znaków „stri” lub „stra”, gdzie bezpośrednio po tych sekwencjach następuje „ng”. Innymi słowy, nasze wyszukiwane hasło będzie szukało wyrazów „string” i „strang”. Termin podstawienia to „huk”.

ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

zmień nazwę 's / (stri | stra) ng / bang /' * .c w oknie terminala

Użycie ls po raz drugi potwierdza, że ​​string.c stało się bang.c, a strangle.c jest teraz bangle.c.

Korzystanie z tłumaczeń ze zmianą nazwy

Polecenie rename może wykonywać działania na nazwach plików zwanych tłumaczeniami. Prostym przykładem tłumaczenia byłoby wymuszenie na zestawie nazw plików zapisanych wielkimi literami.

W poniższym poleceniu zmiany nazwy zauważ, że nie używamy s / do rozpoczęcia centralnego wyrażenia, używamy y /. To mówi rename, że nie wykonujemy podstawienia; wykonujemy tłumaczenie.

Termin az to wyrażenie w języku Perl, które oznacza wszystkie małe litery w sekwencji od a do z. Podobnie termin AZ reprezentuje wszystkie wielkie litery w kolejności od A do Z.

Centralne wyrażenie w tym poleceniu można sparafrazować jako „jeśli w nazwie pliku znajduje się którakolwiek z małych liter od a do z, zastąp je odpowiednimi znakami z sekwencji wielkich liter od A do Z”.

Aby wymusić na nazwach wszystkich plików „.prg” pisanie wielkimi literami, użyj tego polecenia:

zmień nazwę 'y / az / AZ /’ * .prg

ls *.PRG

zmień nazwę 'y / az / AZ /' * .prg w oknie terminala

Polecenie ls pokazuje nam, że wszystkie nazwy plików „.prg” są teraz pisane wielkimi literami. W rzeczywistości, żeby być dokładnym, nie są to już pliki „.prg”. To pliki „.PRG”. Linux rozróżnia wielkość liter.

Możemy odwrócić to ostatnie polecenie, odwracając pozycję wyrażeń az i AZ w środkowym wyrażeniu.

zmień nazwę 'y / AZ / az /’ * .PRG

ls *.prg

zmień nazwę 'y / AZ / az /' * .PRG w oknie terminala

Ty (Wo | Do) nie nauczysz się Perla w pięć minut

Zapoznanie się z Perlem to dobrze spędzony czas. Jednak aby zacząć korzystać z oszczędzających czas możliwości polecenia rename, nie musisz mieć zbyt dużej wiedzy na temat języka Perl, aby czerpać duże korzyści z mocy, prostoty i czasu.