Zmienić nazwy wszystkich plików w katalogu z $ filename_h na $ filename_half?

139

Śmiertelnie proste.

Jak zmienić nazwę

05_h.png
06_h.png

do

05_half.png
06_half.png

Przynajmniej myślę, że to proste, ale trudno jest Google na tego typu rzeczy, chyba że już wiesz.

Dzięki....

Richard
źródło

Odpowiedzi:

302

Po prostu użyj basha, nie musisz wywoływać poleceń zewnętrznych.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Nie dodawaj #!/bin/sh

Dla tych, którzy potrzebują tej jednej linijki:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
bash-o-logist
źródło
7
Niezłe użycie wbudowanego zamiennika stringów basha zamiast seda
dandrews
3
to jest wyrażenie regularne file / _h.png / _half.png?
user2799603
15
Nie, format jest następujący: $ {łańcuch / podciąg / podstawienie} - „podstawienie pierwszego wystąpienia”. Więcej informacji można znaleźć w tym ściągawce
WindRider
11
Jakieś powody Do not add #!/bin/sh? Próbowałem pracować z tym stwierdzeniem lub bez niego.
Ryan
6
@Ryan @Ishan Jain W rzeczywistości wskazuje na wewnętrzną powłokę, która musi wykonać skrypt. sh i bash to różne powłoki, więc może mieć wpływ na zachowanie i składnię skryptu. Ponieważ skrypt używa wbudowanego zamiennika ciągu bash, należy dodać nagłówek #!/bin/bash. To powiedziawszy, bash jest zwykle domyślną powłoką w wielu komputerach, więc nie znajdziesz wielu różnic: D Więcej informacji można znaleźć tutaj
Cristian Ramon-Cortes
65

Wypróbuj renamepolecenie:

rename 's/_h.png/_half.png/' *.png

Aktualizacja:

przykład użycia:

tworzyć treści

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

rozwiązanie testowe:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Michał Šrajer
źródło
1
@CarolineAlexiou: Dodałem przykładową sesję testową. Proszę, spróbuj. Prawdopodobnie masz jakąś literówkę. Jaki jest wynik ls? co rename ...ty próbujesz
Michał Šrajer
2
Nie działa w bash na Macu, fwiw. renamenie jest standardowym narzędziem Unix.
tandrewnichols
1
@tandrewnichols, wypróbuj homebrew - po zainstalowaniu zmiana nazwy staje się dostępna w ciągu kilku sekund dziękibrew install rename
Simbamangu
4
jak dla mnie zmiana nazwy nie zadziałała's//'rename [options] expression replacement file...rename from util-linux 2.23.2
odwołałem się
2
pamiętaj, że .pasuje do DOWOLNEGO znaku, a nie tylko kropki - \.zamiast kropki należy użyć
Meisner
11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Karoly Horvath
źródło
1
To jest świetne do zrobienia wcześniej suchego biegu. Po raz pierwszy otrzymuje mv $f $fnewsię echo $fnewjako druga linia aby upewnić się, że zdrowy wygląd wyjściowych.
lobati
10

Szukasz czystego rozwiązania bash? Istnieje wiele podejść, ale oto jedno.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Zakłada się, że jedynymi plikami w bieżącym katalogu, które kończą się na, _h.pngsą te, których nazwę chcesz zmienić.

O wiele bardziej szczegółowo

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Zakładając, że te dwa przykłady są jedynymi. pliki.

W ogólnym przypadku zmiany nazw plików w nie zostały objęte przed .

sorpigal
źródło
6

Użyj renamenarzędzia napisanego w perlu. Może być tak, że domyślnie nie jest dostępny ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Fredrik Pihl
źródło
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
źródło
4

Miałem podobne pytanie: w instrukcji opcja zmiany nazwy jako

rename [option] expression replacement file

więc możesz go używać w ten sposób

rename _h _half *.png

W kodzie: „_h” to wyrażenie, którego szukasz. „_half” to wzorzec, którym chcesz zastąpić. „* .png” to zakres plików, których szukasz dla możliwych plików docelowych.

Mam nadzieję, że to pomoże c:

James Yen
źródło
1

Innym podejściem może być ręczne użycie opcji zmiany nazwy partii

Kliknij plik prawym przyciskiem myszy -> Niestandardowe polecenia pliku -> Zmień nazwę partii i możesz zastąpić h. z połową.

To zadziała dla GUI opartego na Linuksie używającego WinSCP itp

Easwar
źródło
0

Użyj renamenarzędzia:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
C. Ramseyer
źródło
0

Jedna wkładka:
for file in *.php ; do mv "$file" "_$file" ; done

Jadeye
źródło
0

Chociaż zestaw odpowiedzi jest kompletny, muszę dodać kolejny brakujący.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Tharindu Sathischandra
źródło