Pliki zmiany nazwy partii


149

Mam katalog pełen obrazów:

image0001.png
image0002.png
image0003.png
...

I chciałbym, aby jedna linijka zmieniła ich nazwy na (powiedzmy).

0001.png
0002.png
0003.png
...

Jak mam to zrobic?


8
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:

for f in *.png; do
    mv -- "$f" "${f#image}"
done

2
Jest to jedna z metod zastępowania parametrów pokazana w Mendel Coopers Advanced Bash-scripting guide tldp.org/LDP/abs/html
— W_Whalley

2
@W_Whalley Zdecydowanie zalecam unikanie tego przewodnika, na korzyść Przewodnika Wooledge Bash .
— Wildcard

@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:

  rename image '' *.png

6
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:

zmv -w 'image*.png' '$1.png'

4
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*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done

6

Lubię Perla, więc:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Możesz również użyć tego samego wzorca do innych zadań, takich jak kopiowanie plików do innego katalogu:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'

2
Lub (bezpieczniej!):rename($old,$_)
— reinierpost

5

qmv

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.

Nazwy plików w twoim edytorze

$ qmv *.png

W edytorze:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Edytuj nazwy w prawej kolumnie:
(Usuwanie imageprefiksu ze wszystkich linii za pomocą trybu blokowania wizualnego)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Dziennik zmiany nazwy:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(np Ubuntu: apt-get install renameutils)


3

rekurencyjny

łatwe rekurencyjne wybieranie plików obrazu * png i nie zakłada konieczności radzenia sobie z nowym wierszem w nazwach plików

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Bezpieczny, radzi sobie ze spacjami, nowymi wierszami, odwrotnymi ukośnikami i wszystkim innym :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done

1

POSIX sh za pomocą pętli while

Odczytywanie nazw z findpolecenia.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Odczytywanie nazw z pliku

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


1

W systemach Windows i Linux ten skrypt Perla zrobi; w tym przypadku:

$ rnm -l 's/^image//' '*.png'

Skrypt może uruchamiać się rekurencyjnie w katalogach, a nawet przygotowywać liczenie do wszystkich:

$ rnm -r 's/^/$counter./' '/\.png$/'

Znaki UTF-8 są również poprawnie traktowane, zarówno w systemie Windows, jak i Linux.



0

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ł:

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

-5

ls * png | podczas odczytu -rf; do f2 = "` echo $ f | sed -e's / image // '' "; mv $ f $ f2; gotowy


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 .
— kojiro
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.