Вы можете изменить несколько параметров на время с помощью двойной косой черты.
for f in * ; do mv "$f" "${f//[()]/}.jpg" ; done
Вы можете переименовать кратные файлы с помощью команды переименовать
. В этом случае рабочим решением может быть:
rename 's/\(//; s/\)/.jpeg/;' image*
Я отвечу на ваш общий вопрос о том, как делать множественные замены (в частности, при переименовании, хотя это может быть применимо и в других контекстах). Предположим, что у вас есть куча файлов. имена которых включают слова "over" и "dog", и вы хотите заменить их на "under" и "cat", соответственно.
for f in *
do
g=${f/over/under}
h=${g/dog/cat}
mv -- "$f" "$h"
done
(Правила --
защищают вас от нежелательного поведения
которое может быть вызвано именем файла, начинающимся с --
.
Если хотите, измените последнюю строку на mv -- "$f" "$h".jpg
).
Обратите внимание, что если имя файла содержит только "over" или "dog"
(но не оба), то будет произведена только одна из доступных замен.
Если имя содержит "dog" и "over" (в таком порядке),
он все равно выполнит замену.
В представленном вами случае, когда строки содержат "(" и ")",
вам может не понравиться такое поведение.
P.S. Реалистично,
вам, вероятно, следует защитить команду mv
следующим образом:
if [ "$f" != "$h" ] then if [ -e "$h" ] then (Error handling) else mv -- "$f" "$h" fi done
чтобы избежать получения сообщения об ошибке при попытке переименовать файл в сам себя
(потому что его имя не содержит ни одной из строк),
и чтобы избежать повреждения существующего файла.
(например, если у вас есть файл image(1)
и у вас уже есть файл image1.jpg
).
sed
for f in *
do
g=$(sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/' <<< "$f")
mv -- "$f" "$g"
done
Этот способ противоположен первому: он выполняет замену только в том случае, если слова "over" и "dog" оба появляются (в таком порядке) и не иначе.
Синтаксис <<<
("здесь строка") работает не во всех оболочках.
Чтобы сделать вышеописанное в оболочке, которая не поддерживает строки here, сделайте:
for f in *
do
g=$(printf "%s" "$f" | sed 's/\(.*\)over\(.*\)dog\(.*\)/\1under\2cat\3/')
mv -- "$f" "$g"
done