Czy istnieje sposób na szybką zmianę wszystkich rozszerzeń wszystkich plików w folderze?

15

Mam duży folder książek audio .m4b, które w obecnym formacie nie będą odtwarzane na moim telefonie z Androidem. Jednak działają one dobrze, jeśli zostaną przemianowane na .m4a

Czy istnieje szybka metoda lub polecenie terminala, które może zmienić nazwę każdego pliku .m4b w folderze na .m4a? Nie ma potrzeby jakiejkolwiek konwersji plików, po prostu zmiana nazwy rozszerzenia pliku działa idealnie.

paznokieć
źródło
2
FYI: renamejest skryptem PERL i akceptuje wyrażenia regularne. Systemy Debian mają również rename.ulpolecenie w ramach util-linux-ng package. Jeśli perl nie jest zainstalowany (ok, bardzo mało prawdopodobne;)) renamerównież nie jest.
Rinzwind

Odpowiedzi:

17

To zrobi za ciebie robotę.

rename 's/.m4b$/.m4a/' *.m4b

Do uruchomienia testowego możesz użyć tego polecenia:

rename 's/.m4b$/.m4a/' *.m4b -vn

-v oznacza „pełny” i wyświetli nazwy plików, gdy zmieni ich nazwę.

-n wykona test, w którym nie zmieni nazwy żadnych plików, ale wyświetli listę plików, których nazwy zostaną zmienione.

Basharat Sialvi
źródło
Znacznie lepsza odpowiedź niż moja. Byłem leniwy i próbowałem nie używać wyrażeń regularnych ...
adempewolff
Dziękuję, działa uczta. Dzięki @adempewolff za wysiłek
covernail
10

Bardzo szybkim sposobem na zmianę nazw plików, jeśli to wszystko, co musisz zrobić, i nie musisz konwertować ich do innego formatu, jest użycie rozszerzeń parametrów Bash, które są bardzo ładnie opisane na wiki Bash .

Istnieje kilka różnych sposobów zmiany rozszerzenia, ale używam tutaj prostego ${var/original/replacement}paradygmatu:

for file in *.m4b; do mv -- "${file}" "${file/%m4b/m4a}"; done

Jeśli chcesz zobaczyć, co zostanie zmienione przez polecenie, umieść je echowcześniej, mva zmiany zostaną wyświetlone.

Nie trzeba dodawać, że ten oneliner można zmodyfikować również dla innych plików, a także można użyć rozszerzeń parametrów, aby usunąć rozszerzenia plików.


źródło
+1 W ten sposób działa tak samo jak odpowiedź @Basharat Sial, z tym że działa również, gdy masz wiele pasujących plików *.m4b. W przeciwnym razie trafisz na błąd argument list too long.
matt płonie
Ponadto, aby zobaczyć, jak to się dzieje, dodaj pełną flagę:for file in *.m4b; do mv -v -- "${file}" "${file/%m4b/m4a}"; done
Matt