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

12

У меня есть много файлов в папке, и я хочу добавить к ним префикс или суффикс (не оба ). Я проверил здесь и узнал, что я могу использовать

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

добавить префикс ко всем файлам, оканчивающимся на .jpg(и если я удалю .jpg, он добавит префикс ко всем файлам в текущей папке).

Тем не менее, я хотел бы иметь возможность

  • Добавить суффикс (то есть переименовать filename.extв filename.whatever.ext),
  • Проверьте, если префикс или суффикс уже присутствует, а затем пропустите,
  • Создайте псевдоним, который принимает аргументы, такие как addprefix whatever *.extилиaddsufix whatever *.*
Этот бразильский парень
источник

Ответы:

10

Если вы используете bash, то этот однострочный может сделать это для вас (при условии, что у вас есть переменные $prefix, $suffixи $extensionлегко доступны)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Вы можете сделать так, чтобы ваши сценарии были такими

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

и

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Аарон Окано
источник
Это почти идеально! Было бы идеально, если бы он (1) проверил, присутствует ли префикс или суффикс (и затем пропущен), и (2) работал с файлами без расширения. Извините за беспокойство ...
Этот бразильский парень
Для (1) вы можете (я думаю, не проверено) добавить проверку префикса, обернув mv в, if [ $f == $prefix* ]и вы можете изменить суффикс с if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]парой команд mv в adduffix. Для (2) он уже должен работать с файлами без расширения, если я не ужасный программист.
Аарон Окано
7

Есть команда Perl,rename которая должна сработать. Однако будьте осторожны: вызывается несколько разных команд rename, поэтому убедитесь, что у вас есть скрипт Perl, который ожидает в perlexprкачестве аргумента a . Это renameкоманда, предоставляемая perlпакетом для Debian и производных (Ubuntu, Mint,…), но не для других дистрибутивов, которые могут иметь другую утилиту rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Как видите, он идемпотентен - он не будет добавлять префикс снова, когда вы вызываете его несколько раз.

Он работает либо заменой начала (нулевой длины) строк ( ^), либо начала, за которым следует необязательная prefixстрока с prefix.

Я оставлю инкапсуляцию этого в сценарии оболочки или функции оболочки в качестве упражнения для вас :)

Postfix немного сложнее, потому что вы должны выяснить, какая часть имени файла представляет собой расширение ...

Мартин фон Виттих
источник
Это хороший ответ, но я искал что-то более универсальное; для этого ответа вам понадобится как perl, так и этот конкретный (или эквивалентный) rename. И я знаю, что суффиксы немного сложнее, они не были затронуты в связанном вопросе, и я новичок в Linux, Bash, сценариях оболочки, Perl и регулярных выражениях, так что «немного сложнее» довольно сложно для меня ! :)
Этот бразильский парень
4

С zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~является оператором смещения, что означает, кроме как в zsh.

Стефан Шазелас
источник
1

Простой пример изменения префикса и расширения всех изображений в текущей папке.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Если вы хотите проверить, как это повлияет на ваши данные, прежде чем менять их, замените mv на echo.

вывод для IMG_7993.JPG - EG_IMG_7993.jpg

Цзиньси
источник