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?

Człowiek internetu
źródło
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
W_Whalley
źródło
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
Człowiek internetu
źródło
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'
Gilles
źródło
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.

Marcel Stimberg
źródło
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
X Tian
źródło
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 $_)'
gvkv
źródło
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)

Volker Siegel
źródło
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
X Tian
źródło
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
X Tian
źródło
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.

circulosmeos
źródło
0

Możesz użyć tego narzędzia: rnm ( strona internetowa )

W twoim przypadku polecenie byłoby:

rnm -rs '/^image//' *.png

Więcej przykładów / dokumentów znajdziesz tutaj .

Jahid
źródło
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
Wei Shen
źródło
-5

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

Ivan P.
źródło
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