Mam wiele plików z .abc
rozszerzeniem i chcę je zmienić na .edefg
Jak to zrobić z wiersza polecenia?
Mam folder główny z wieloma podfolderami, więc rozwiązanie powinno działać rekurencyjnie.
command-line
bash
rename
batch-rename
Tommyk
źródło
źródło
Odpowiedzi:
Przenośny sposób (który działa na każdym systemie zgodnym z POSIX):
W bash4 możesz użyć globstar, aby uzyskać rekurencyjne globusy (**):
Komenda (perl)
rename
w Ubuntu może zmieniać nazwy plików przy użyciu składni wyrażeń regularnych perl, którą można łączyć z globstar lubfind
:Zobacz także http://mywiki.wooledge.org/BashFAQ/030
źródło
"${1%.abc}"
rozwija się do wartości$1
oprócz „bez”.abc
na końcu. Zobacz faq 100, aby uzyskać więcej informacji na temat manipulacji ciągami powłoki.${1%.abc}...
sh -c
pierwszym argumentem przypisuje się $ 0, a wszelkie pozostałe argumenty są przypisywane do parametrów pozycyjnych . Więc_
jest obojętne argumentem, a „{}” jest pierwszym argumentem pozycyjnymsh -c
.Wykona to wymagane zadanie, jeśli wszystkie pliki znajdują się w tym samym folderze
Aby zmienić nazwę plików rekurencyjnie, użyj tego:
źródło
rename 's/.abc$/.edefg/' /path/to/root/folder/**/*.abc
w nowoczesnej wersji Bash.s
na początku i jakie inne opcje mogę tam wykorzystać. Dzięki !Jednym z problemów z rekurencyjnymi nazwami jest to, że bez względu na metodę, której używasz do zlokalizowania plików, przekazuje całą ścieżkę
rename
, a nie tylko nazwę pliku. Utrudnia to skomplikowane zmiany nazw w zagnieżdżonych folderach.Używam
find
„s-execdir
działania, aby rozwiązać ten problem. Jeśli użyjesz-execdir
zamiast-exec
, określone polecenie jest uruchamiane z podkatalogu zawierającego dopasowany plik. Zamiast przejść całą ścieżkęrename
, przechodzi ona tylko./filename
. To znacznie ułatwia napisanie wyrażenia regularnego.Szczegółowo:
-type f
oznacza tylko wyszukiwanie plików, a nie katalogów-name '*.abc'
oznacza tylko pasujące nazwy plików, które kończą się na .abc'{}'
to symbol zastępczy, który oznacza miejsce, w którym-execdir
wstawi znalezioną ścieżkę. Pojedyncze cudzysłowy są wymagane, aby umożliwić obsługę nazw plików ze spacjami i znakami powłoki.-type
i-name
są znakiem kontynuacji linii bash. Używam ich, aby ten przykład był bardziej czytelny, ale nie są one potrzebne, jeśli umieścisz wszystkie polecenia w jednym wierszu.-execdir
Wymagany jest jednak odwrotny ukośnik na końcu linii. Jest tam, aby uciec od średnika, który kończy uruchamiane polecenie-execdir
. Zabawa!Objaśnienie wyrażenia regularnego:
s/
początek wyrażenia regularnego\.\/
dopasuj wiodące ./, które przechodzi -execdir. Użyj \, aby wyjść z. i / metaznaki (uwaga: ta część różni się w zależności od wersjifind
. Zobacz komentarz od użytkownika @apollo)(.+)
dopasuj nazwę pliku. Nawiasy przechwytują dopasowanie do późniejszego wykorzystania\.abc
ucieczka kropka, dopasuj abc$
zakotwicz dopasowanie na końcu łańcucha/
oznacza koniec części „dopasowującej” wyrażenia regularnego i początek części „zamień”version1_
dodaj ten tekst do każdej nazwy pliku$1
odwołuje się do istniejącej nazwy pliku, ponieważ przechwyciliśmy ją w nawiasach. Jeśli używasz wielu zestawów nawiasów w części „Dopasuj”, możesz odwołać się do nich tutaj, używając 2 USD, 3 USD itp..abc
nowa nazwa pliku zakończy się na .abc. W sekcji „zamień” nie ma potrzeby ucieczki od metaznaku kropkowego/
koniec wyrażenia regularnegoPrzed
Po
Wskazówka:
rename
Opcja -n jest przydatna. Robi próbę na sucho i pokazuje, jakie nazwy zmieni, ale nie wprowadza żadnych zmian.źródło
--execdir
nie przeszedł on na początek,./
więc\.\/
część wyrażenia regularnego można pominąć. Może dlatego, że korzystam z OSX, a nie UbuntuInny przenośny sposób:
źródło
Zobacz także wpis, dlaczego nie powinieneś analizować
ls
.Edycja: jeśli musisz użyć basename, składnia wyglądałaby następująco:
https://unix.stackexchange.com/questions/19654/changing-extension-to-multiple-files
źródło
To właśnie zrobiłem i działałem tak, jak chciałem. Użyłem
mv
polecenia. Miałem wiele.3gp
plików i chciałem zmienić ich nazwy na wszystkie.mp4
Oto krótki oneliner:
Który po prostu skanuje bieżący katalog, pobiera wszystkie pliki .3gp, a następnie zmienia nazwy (przy użyciu mv) na
ren-name_of_file.mp4
źródło
file.3gp
nafile.3gp.mp4
, co może nie być tym, czego chce większość ludzi..3gp
lub.mp4
tutaj były tylko w celach ilustracyjnych.basename "$i" .mp4
poprzedniego rozszerzenia zamiast „ren- $ i.mp4”.Znalazłem łatwy sposób na osiągnięcie tego. Aby zmienić rozszerzenia wielu plików z jpg na pdf, użyj:
źródło
Chciałbym użyć polecenia MMV z pakietu o tej samej nazwie :
W
;
dopasowuje zero lub więcej*/
i odpowiada#1
na wymianę. Do*
odpowiada#2
. Byłaby to wersja nierekurencyjnaźródło
Zmień nazwy plików i katalogów za pomocą
find -execdir | rename
Jeśli zamierzasz zmienić nazwę zarówno plików, jak i katalogów, nie tylko za pomocą przyrostka, to jest to dobry wzorzec:
Niesamowita
-execdir
opcja robicd
w katalogu a przed wykonaniemrename
polecenia, w przeciwieństwie do-exec
.-depth
upewnij się, że zmiana nazwy nastąpi najpierw dla dzieci, a następnie dla rodziców, aby zapobiec potencjalnym problemom z brakującymi katalogami rodziców.-execdir
jest wymagane, ponieważ zmiana nazwy nie działa dobrze w przypadku ścieżek wejściowych innych niż basename, np. nie działa:PATH
Hacking jest wymagane, ponieważ-execdir
ma jeden bardzo przykry wadę:find
jest bardzo uparty i nie chce nic robić ze-execdir
jeśli masz żadnych ścieżek względnych wPATH
zmiennej środowiskowej, na przykład./node_modules/.bin
, w przypadku braku z:Zobacz także: Dlaczego użycie akcji „-execdir” nie jest bezpieczne dla katalogu znajdującego się w zmiennej PATH?
-execdir
to rozszerzenie GNU do POSIX .rename
jest oparty na Perlu i pochodzi zrename
pakietu. Testowane w Ubuntu 18.10.Zmień nazwę obejścia obejścia
Jeśli twoje ścieżki wejściowe nie pochodzą
find
lub jeśli masz dość relatywnej irytacji ścieżki, możemy użyć Perla lookahead, aby bezpiecznie zmienić nazwy katalogów jak w:Nie znalazłem dogodnym dla analogowych
-execdir
zxargs
: https://superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686Jest
sort -r
to konieczne, aby upewnić się, że pliki następują po odpowiednich katalogach, ponieważ dłuższe ścieżki pojawiają się po krótszych z tym samym prefiksem.źródło