Nie jest to dla mnie całkowicie jasne, ale jaka jest różnica między mv
i rename
(od util-linux-ng 2.17.2
as /usr/bin/rename
)? Czy istnieją zalety jednego nad drugim poza rename
akceptowaniem wyrażeń regularnych, a mv
nie? Wierzę, że rename
może obsługiwać wiele nazw plików jednocześnie, podczas mv
gdy nie robi tego.
Nie mogłem znaleźć wyraźnego wskazania na ich man
stronach, co jeszcze je wyróżnia, ani przez własne dochodzenie.
type -a rename
arename --version
?rename is /usr/bin/rename
irename (util-linux-ng 2.17.2)
odpowiednio.rename
może oznaczać różne rzeczy w różnych dystrybucjach.Odpowiedzi:
Jest to w zasadzie to, co jest napisane na wieczku, dla obu.
mv
to standardowe narzędzie do przenoszenia jednego lub więcej plików do danego celu. Można go użyć do zmiany nazwy pliku, jeśli istnieje tylko jeden plik do przeniesienia. Jeśli jest ich kilka,mv
działa tylko wtedy, gdy celem jest katalog i przenosi tam pliki.Więc
mv foo bar
albo przeniesie plikfoo
do katalogubar
(jeśli istnieje), albo zmieni nazwęfoo
nabar
(jeślibar
nie istnieje lub nie jest katalogiem).mv foo1 foo2 bar
po prostu przeniesie oba pliki do katalogubar
lub narzekam, jeślibar
nie jest to katalog.mv
wywołarename()
funkcję biblioteki C, aby przenieść pliki, a jeśli to nie zadziała (zostaną przeniesione do innego systemu plików), skopiuje pliki i usunie oryginały.Jeśli wszystko, co masz, to
mv
i chcesz zmienić nazwę wielu plików, będziesz musiał użyć pętli powłoki. Istnieje wiele pytań, na które tutaj na miejscu, patrz na przykład to , to , i inne .Z drugiej strony różne
rename
narzędzia zmieniają nazwy plików indywidualnie.Wspomniany
rename
z util-linux dokonuje prostego podstawienia łańcucha, np.rename foo bar *
Zmieniłby sięfoobar
nabarbar
iasdffoo
naasdfbar
. To nie nie biorą jednak wyrażenia regularnego!Narzędzie zmiany nazwy Perla ( lub różne jego instancje ) pobiera wyrażenie Perla w celu transformacji nazw plików. Najprawdopodobniej użyjesz polecenia, w którym wzorzec jest wyrażeniem regularnym.
s/pattern/replacement/
Zarówno zmiana nazwy util-linux, jak i zmiana nazwy Perla mogą być używane do przenoszenia plików do innego katalogu w tym samym czasie, poprzez dokonanie odpowiednich zmian w nazwie pliku, ale jest to trochę niewygodne. Podobnie jak wywoływanie
rename()
plików, więc przenoszenie się z jednego systemu plików do drugiego nie działa.Jak na
rename
to masz, może to zależeć od twojej dystrybucji i / lub tego, co zainstalowałeś. Większość z nich obsługujerename --version
, więc użyj tego, aby określić, który z nich masz.źródło
rename '$_=lc' *
Małe nazwy plików. Ale myślę, że najczęstszym przypadkiem jest użycies///
(o którym wspomniałem), a część wzorcowa to wyrażenie regularne; Nie sądzę, żebyś mógł użyć tam funkcji. Możesz to jednak zrobić w części zamiennej.rename.ul
jest i będzie dla wersji util-linux, a nie dla żadnej innej.man rename
więc dobrze byłoby wiedzieć, jak rozumiesz przykład z Debianarename foo foo0 foo?; rename foo foo0 foo??
przykład, ponieważ była to jedyna różnica między tymi dwoma stronami podręcznika , które widziałem. Ta para poleceń działa, ponieważ pierwsza dodaje zero do nazw każdej jednocyfrowej nazwy pliku, a następnie druga dodaje (kolejne) zero do każdej dwucyfrowej nazwy pliku. Ten drugi zestaw zawiera pliki, których nazwa została zmieniona przez pierwsze polecenie. Używanierename foo foo00 foo?
pierwszego polecenia również działa, po prostu dodaje dwa zera za jednym razem.mv
po prostu zmienia nazwę pliku (można go również przenieść do innego systemu plików lub ścieżki). Nadajesz mu starą nazwę i nową nazwę, i zmienia plik na nową nazwę lub lokalizację.rename
służy do wprowadzania zbiorczych zmian nazewnictwa. Załóżmy, że miał tysiąc plików,foo000.log
dziękifoo999.log
i chcesz zmienić ichbar000.log
? Poprzezbar999.log
. Zemv
trzeba by zrobićmv foo000.log bar000.log
,mv foo001 bar001.log
itd albo napisać skrypt. Porename
prostu zrób torename foo bar foo*.log
i voila, tysiąc plików zmienia się w jednej chwili! Całkiem fajne. Sprawdźman rename
stronę ponownie, aby uzyskać szczegółowe informacje.źródło
mv
Jest to podstawowy wiersz poleceń zaprojektowany, aby zrobić jedną rzecz i zrobić to dobrze (filozofia Uniksa): przenieś plik (i) lub reżyser (y) .
Możesz hakować
STDOUT
iSTDIN
¹, aby modyfikować w locie ciąg docelowy, ale to nie jest mądry hackzmień nazwę (Perl's)
Istnieją inne narzędzia o tej samej nazwie, które mogą lub nie mogą tego zrobić, więc bądź ostrożny.
Kiedy ludzie mówią
rename
, myślimy o tym, a nie o tymELF
, mniej potężnym (magia?).To nie jest podstawowe, to Perl. Możesz przekazać niektóre funkcje Perla w środku, i jest to niezwykle potężne.
Rozważ ten przykład:
Chcesz zmienić nazwę wielu plików takich jak
Możesz dodawać zera do cyfr w
sprintf()
następujący sposób (używając regex, heh, to Perl: D):Teraz masz :
To nie jest naprawdę podstawowe polecenie, prawda?
zmiana nazwy nie jest tak naprawdę zaprojektowana do przenoszenia katalogów , ale może to zrobić:
Przeniesiony plik
¹ trochę kodu, który widzimy na
*.stackexchange.*
stronach internetowychTo nie jest właściwa droga , to zwykły buggy, po prostu, aby wyjaśnić, dlaczego używać właściwego narzędzia we właściwym momencie
źródło
sprintf
ing przy zmianie nazwymv przenosi lub zmienia nazwy plików i katalogów i tworzy ich kopie zapasowe; zmiana nazwy zmienia tylko nazwy plików.
mv ma więcej możliwości i opcji. Spójrz na przełączniki na stronach podręcznika dla każdego, aby zobaczyć różnice w możliwościach. Rzućmy okiem za pomocą man w Ubuntu 18.04LTS (przebieg może się różnić w zależności od wersji każdego pakietu):
opcje mv (pomijając pomoc i wersję)
zmień nazwę opcji (pomijając pomoc i wersję)
źródło