To jedno z najczęściej zadawanych pytań dotyczących wiersza poleceń systemu Unix i nie mogę go już znaleźć na tej stronie, więc czy powinniśmy utworzyć Wiki Wiki?
Gilles
5
Nie rozumiem dlaczego. To konkretne pytanie z możliwą do zweryfikowania odpowiedzią.
Internetowiec
3
Jeśli korzystasz z X, nie jest to o wiele łatwiejsze niż thunar -B *.pngw przypadku narzędzia GUI Thunara do masowej zmiany nazwy.
dotjoe,
@dotjoe Dzięki, Thunar jest naprawdę interesujący.
Volker Siegel
Odpowiedzi:
105
Jeśli używasz Bash lub innej powłoki kompatybilnej z POSIX:
@Wildcard: jakie są powody, dla których warto unikać przewodnika ABS?
Christian Severin,
@ChristianSeverin promowanie złych praktyk i całkowicie złamanego kodu. Sprawdź linki na mojej stronie profilu.
Wildcard
Jeśli nie wiesz, jak dostosować ten przykład do różnych wzorców plików, możesz rzucić okiem na sekcję Rozszerzenia parametrów wspomnianego wyżej przewodnika.
lex82
108
W przypadku Debiana i pochodnych Perl renamedziała podobnie do sedtego:
rename -v 's/image//'*.png
Jest też renameod util-linux, który działa w ten sposób, zamiast:
naprawdę powinieneś wyjaśnić, że jest to program perlowy, który może wymagać instalacji i że jako argument przyjmuje wyrażenia regularne.
Ach, nie byłem tego świadomy. Przyznam odpowiedź kanoniczną, kiedy ją zidentyfikuję :)
Internetowiec
5
Ten renameprogram pochodzi z dystrybucji przykładów Perla. Debian i Ubuntu dostarczają go jako /usr/bin/rename. Inne warianty Uniksa mogą tego nie zapewniać lub mogą oferować zupełnie inne /usr/bin/rename.
Gilles
1
Niektóre wersje renamewziąć od do wzorca Zamiennik:rename [options] <expression> <replacement> <file>...
melds
1
Jeśli używasz systemu opartego na Debianie, to sudo apt-get install rename, możesz użyć polecenia rename. Jest sed dla nazw plików.
ctrl-alt-delor
41
zmv
Powłoka Zsh ma potężne polecenie zmiany nazwy partii o nazwie zmv.
Najpierw musisz włączyć zmvpolecenie w następujący sposób (może przejść do twojego ~/.zshrc).
autoload zmv
Podstawowa składnia to zmv PATTERN REPLACEMENT. Wzorzec jest globalnym wyrażeniem powłoki. Części wzoru mogą być otoczone nawiasami. Tekst może zawierać wymiana $1, $2itp odnieść się do n-tej grupy parenthesised we wzorcu. Na przykład:
zmv 'image(*.png)''$1'
Można również poprosić zsh automatycznie określić $1, $2itp dopasować symbole wieloznaczne w strukturze:
sweeeeeeeeeeeeeeeeeet. jeszcze jeden powód, dla którego powinienem uczyć się Zsh
ixtmixilix
1
@ixtmixilix czego się nauczyć? Po prostu zacznij go używać i być może dodaj prezto ( github.com/sorin-ionescu/prezto ) dla dodatkowej niesamowitości.
Gerry,
Naprawdę fajne, jak wskazano w człowieku zmv, można to jeszcze bardziej uprościć, dodając alias mmv = 'noglob zmv -W' do: mmv * .c.orig orig / *. C
Bretsko
Włączenie zmvprezto wymaga odkomentowania linii w twoim ~ / .zpreztorc po # Set the Zsh functions to load (man zshcontrib).podaniuzstyle ':prezto:load' zfunction 'zargs' 'zmv'
33
Zwykle używam ładnego i prostego narzędzia mmv ( strona podręcznika ) dla tego przypadku:
$ mmv "image*.png""#1.png"
wykona twoje zadanie.
#1We wzorcu celu zostaną podstawione co odpowiada wieloznaczny w strukturze źródłowej. Działa to również w przypadku wielu symboli wieloznacznych i może być użyte na przykład do zmiany kolejności części nazw plików. Możesz także z łatwością wykonywać bardziej skomplikowane czynności, takie jak konwertowanie małych liter na wielkie litery.
Pamiętaj, aby chronić wzory przed powłoką, cytując.
Dziękujemy za wskazanie tego narzędzia. Znalazłem go w repozytoriach Debian, Ubuntu i Cygwin. Miałem problem ze stroną podręcznika, ale znalazłem kilka stron internetowych i to pytanie przepełnienia stosu, które pomogło wyjaśnić, w jaki sposób go używasz. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley
Dzięki, dodałem więcej informacji do odpowiedzi, aby było jaśniej.
Marcel Stimberg,
3
Nie mogę głosować wystarczająco! To takie proste i przyjazne. Dostępne dla OS X w wersji Homebrew.
Greg Dubicki
9
POSIX sh dla pętli
Używa sed do zmiany nazwy
for i in image*jpgdo
mv -v "$i""$(echo "$i" | sed -e 's/^\.\/image//' - )"done
Polecenie qmvz renameutilsotwiera edytor pokazujący listę nazw plików z dwoma kolumnami, oddzielonymi tabulatorem. Każdy wiersz pokazuje jedną z nazw plików, taką samą w obu kolumnach. Prawa kolumna reprezentuje nowe nazwy plików.
Aby wprowadzić zmiany, edytuj nazwy po prawej stronie. W tym przykładzie :%s/...pomocny jest tryb bloku wizualnego.
Wypróbuj brename ( https://github.com/shenwei356/brename ), praktyczne wieloplatformowe narzędzie wiersza poleceń do bezpiecznego grupowania nazw plików / katalogów za pomocą wyrażeń regularnych (obsługujących Windows, Linux i OS X).
Linux ma wiele opcji zmiany nazw plików wsadowych, ale nie widziałem żadnych niedociągnięć w brename, które wyskoczyłyby na mnie.
Cechy:
Międzyplatformowy . Obsługa systemów Windows, Mac OS X i Linux.
Bezpieczny . Przez sprawdzanie potencjalnych konfliktów i błędów .
Filtrowanie plików . Obsługa włączania i wyłączania plików za pomocą wyrażeń regularnych. Nie trzeba uruchamiać poleceń takich jak find ./ -name "*.html" -exec CMD.
Zmiana nazwy przesłania na odpowiednią wartość za pomocą pliku klucz-wartość .
Zmiana nazwy za pomocą rosnącej liczby całkowitej .
Rekurencyjnie zmieniaj nazwy plików i katalogów .
Wspieranie suchobiegu .
Kolorowe wydruki .
Komenda:
$ brename -f .png -p image[INFO] checking:[ ok ]'image0001.png'->'0001.png'[INFO] checking:[ ok ]'image0002.png'->'0002.png'[INFO] checking:[ ok ]'image0003.png'->'0003.png'[INFO]3 path(s) to be renamed[INFO] renamed:'image0001.png'->'0001.png'[INFO] renamed:'image0002.png'->'0002.png'[INFO] renamed:'image0003.png'->'0003.png'[INFO]3 path(s) renamed
Coś jest nie tak: „mv: brak operandu pliku docelowego po 'image0001.png'”
Internetowiec
3
Z twoim kodem jest wiele problemów. Analiza wyniku lsjest po prostu wzywaniem do kłopotów. readpowinno być read -r. wszystkie podstawienia zmiennych powinny zawierać się w podwójnych cudzysłowach.
Gilles
Możesz napisać to bardziej efektywnie jako for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. Analiza lsnie jest ani konieczna, ani dobrym pomysłem .
thunar -B *.png
w przypadku narzędzia GUI Thunara do masowej zmiany nazwy.Odpowiedzi:
Jeśli używasz Bash lub innej powłoki kompatybilnej z POSIX:
źródło
W przypadku Debiana i pochodnych Perl
rename
działa podobnie dosed
tego:Jest też
rename
odutil-linux
, który działa w ten sposób, zamiast:źródło
rename
program pochodzi z dystrybucji przykładów Perla. Debian i Ubuntu dostarczają go jako/usr/bin/rename
. Inne warianty Uniksa mogą tego nie zapewniać lub mogą oferować zupełnie inne/usr/bin/rename
.rename
wziąć od do wzorca Zamiennik:rename [options] <expression> <replacement> <file>...
zmv
Powłoka Zsh ma potężne polecenie zmiany nazwy partii o nazwie
zmv
.Najpierw musisz włączyć
zmv
polecenie w następujący sposób (może przejść do twojego~/.zshrc
).Podstawowa składnia to
zmv PATTERN REPLACEMENT
. Wzorzec jest globalnym wyrażeniem powłoki. Części wzoru mogą być otoczone nawiasami. Tekst może zawierać wymiana$1
,$2
itp odnieść się do n-tej grupy parenthesised we wzorcu. Na przykład:Można również poprosić zsh automatycznie określić
$1
,$2
itp dopasować symbole wieloznaczne w strukturze:źródło
zmv
prezto wymaga odkomentowania linii w twoim ~ / .zpreztorc po# Set the Zsh functions to load (man zshcontrib).
podaniuzstyle ':prezto:load' zfunction 'zargs' 'zmv'
Zwykle używam ładnego i prostego narzędzia mmv ( strona podręcznika ) dla tego przypadku:
wykona twoje zadanie.
#1
We wzorcu celu zostaną podstawione co odpowiada wieloznaczny w strukturze źródłowej. Działa to również w przypadku wielu symboli wieloznacznych i może być użyte na przykład do zmiany kolejności części nazw plików. Możesz także z łatwością wykonywać bardziej skomplikowane czynności, takie jak konwertowanie małych liter na wielkie litery.Pamiętaj, aby chronić wzory przed powłoką, cytując.
źródło
POSIX sh dla pętli
Używa sed do zmiany nazwy
źródło
Lubię Perla, więc:
Możesz również użyć tego samego wzorca do innych zadań, takich jak kopiowanie plików do innego katalogu:
źródło
rename($old,$_)
qmv
Polecenie
qmv
zrenameutils
otwiera edytor pokazujący listę nazw plików z dwoma kolumnami, oddzielonymi tabulatorem. Każdy wiersz pokazuje jedną z nazw plików, taką samą w obu kolumnach. Prawa kolumna reprezentuje nowe nazwy plików.Aby wprowadzić zmiany, edytuj nazwy po prawej stronie. W tym przykładzie
:%s/...
pomocny jest tryb bloku wizualnego.Nazwy plików w twoim edytorze
W edytorze:
Edytuj nazwy w prawej kolumnie:
(Usuwanie
image
prefiksu ze wszystkich linii za pomocą trybu blokowania wizualnego)Dziennik zmiany nazwy:
(np Ubuntu:
apt-get install renameutils
)źródło
rekurencyjny
łatwe rekurencyjne wybieranie plików obrazu * png i nie zakłada konieczności radzenia sobie z nowym wierszem w nazwach plików
Bezpieczny, radzi sobie ze spacjami, nowymi wierszami, odwrotnymi ukośnikami i wszystkim innym :
źródło
POSIX sh za pomocą pętli while
Odczytywanie nazw z
find
polecenia.Odczytywanie nazw z pliku
źródło
Korzystanie z rozszerzenia nawiasu klamrowego :
źródło
W systemach Windows i Linux ten skrypt Perla zrobi; w tym przypadku:
Skrypt może uruchamiać się rekurencyjnie w katalogach, a nawet przygotowywać liczenie do wszystkich:
Znaki UTF-8 są również poprawnie traktowane, zarówno w systemie Windows, jak i Linux.
źródło
Możesz użyć tego narzędzia: rnm ( strona internetowa )
W twoim przypadku polecenie byłoby:
Więcej przykładów / dokumentów znajdziesz tutaj .
źródło
Wypróbuj brename ( https://github.com/shenwei356/brename ), praktyczne wieloplatformowe narzędzie wiersza poleceń do bezpiecznego grupowania nazw plików / katalogów za pomocą wyrażeń regularnych (obsługujących Windows, Linux i OS X).
@patrickDurusau powiedział:
Cechy:
find ./ -name "*.html" -exec CMD
.Komenda:
źródło
ls * png | podczas odczytu -rf; do f2 = "` echo $ f | sed -e's / image // '' "; mv $ f $ f2; gotowy
źródło
ls
jest po prostu wzywaniem do kłopotów.read
powinno byćread -r
. wszystkie podstawienia zmiennych powinny zawierać się w podwójnych cudzysłowach.for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
. Analizals
nie jest ani konieczna, ani dobrym pomysłem .