Переименовать кучу файлов, изменив несколько подстрок [дубликат]

0
23.11.2016, 00:20
3 ответа

Вы можете изменить несколько параметров на время с помощью двойной косой черты.

for f in * ; do mv "$f" "${f//[()]/}.jpg" ; done
0
28.01.2020, 02:47

Вы можете переименовать кратные файлы с помощью команды переименовать . В этом случае рабочим решением может быть:

rename 's/\(//; s/\)/.jpeg/;' image*
1
28.01.2020, 02:47

Я отвечу на ваш общий вопрос о том, как делать множественные замены (в частности, при переименовании, хотя это может быть применимо и в других контекстах).  Предположим, что у вас есть куча файлов. имена которых включают слова "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
0
28.01.2020, 02:47

Теги

Похожие вопросы