Я не уверен, правильно ли я спрашиваю, или это вообще возможно. Я хочу изменить имя некоторых файлов, используя их собственное имя.

Давайте предположим, что у меня есть file1, file2 и file3. Я хочу сделать что-то вроде:

mv file* file{recover_number}_xyz

Чтобы получить: file1_xyz, file2_xyz и file3_xyz

1 ответ1

1

Существуют инструменты, которые могут применять поиск и замену регулярных выражений ко всему имени файла, например, perl-rename (также обычно называемый prename). В таких инструментах вы должны сопоставлять несколько цифр с \d+ или [0-9]+ внутри "группы захвата" (круглые скобки) и ссылаться на нее позже с $1 или \1 зависимости от программы.

Например:

prename -v 's/file(\d+)$/file$1_xyz/' file[123]

prename -v 's/(file\d+)$/$1_xyz/' file[123]

(Опция -v заставляет предварительное имя распечатывать изменения. Вы можете использовать -n чтобы напечатать изменения без фактического переименования.)

Вы также можете добиться этого, используя только mv и sed:

for old in file[123]; do
    new=$(sed -r 's/file([0-9]+)$/file\1_xyz/' <<< "$old")
    mv -v "$old" "$new"
done

Но если вы посмотрите внимательно, вам на самом деле не нужен номер. Все, что вы делаете, так или иначе добавляете некоторый статический текст, например так:

prename 's/$/_xyz/' file[123]

for f in file[123]; do
    mv "$f" "${f}_xyz"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .