Odpowiedzi:
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
Do not add #!/bin/sh
? Próbowałem pracować z tym stwierdzeniem lub bez niego.
#!/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
Wypróbuj rename
polecenie:
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
ls
? co rename ...
ty próbujesz
rename
nie jest standardowym narzędziem Unix.
brew install rename
's//'
rename [options] expression replacement file...
rename from util-linux 2.23.2
.
pasuje do DOWOLNEGO znaku, a nie tylko kropki - \.
zamiast kropki należy użyć
for f in *.png; do
fnew=`echo $f | sed 's/_h.png/_half.png/'`
mv $f $fnew
done
mv $f $fnew
się echo $fnew
jako druga linia aby upewnić się, że zdrowy wygląd wyjściowych.
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.png
są 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 .
Użyj rename
narzę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
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:
Użyj rename
narzę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
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