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


12

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

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

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

Однак я хотів би це зробити

  • Додати SUFIX (тобто, перейменувати 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 у addsuffix. Для (2) вона вже повинна працювати над файлами без розширення, якщо я не жахливий програміст.
Аарон Окано

7

Там в Perl renameкоманда , яка повинна зробити трюк. Але renameбудьте обережні : є кілька різних команд, які викликаються , тому переконайтеся, що у вас є сценарій Perl, який очікує perlexprаргумент. Це 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

Як бачите, він idempotent - він не додасть префікса знову, коли ви будете викликати його кілька разів.

Він працює або замінивши (нульову довжину) початок рядків ( ^), або початок, а потім додатковий prefixрядок на prefix.

Я залишу це інкапсуляцію або в скрипті оболонки, або в функції оболонки, як вправу для вас :)

Постфікс трохи складніше, тому що ви повинні з'ясувати, яка частина імені файлу являє собою розширення ...


Це гарна відповідь, але я шукав щось більш універсальне; для цієї відповіді вам потрібно renameприсутні як perl, так і цей конкретний (або еквівалент) . І я знаю, що суфікси трохи складніше, це не було висвітлено у пов'язаному питанні, і я новачок у Linux, bash, скрипті оболонки, perl та регулярних виразах, тому "трохи важче" мені досить важко ! :)
Той бразильський хлопець


1

Простий приклад для зміни префікса та розширення всіх зображень у поточній папці.

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

Якщо ви хочете перевірити, як це вплине на ваші дані, перш ніж змінити, замініть mv на ехо

вихід для IMG_7993.JPG - EG_IMG_7993.jpg

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.