Масове перейменування, * nix версія


11

Я шукав спосіб перейменувати величезну кількість файлів з аналогічним назвою, приблизно як цей (питання, пов’язане з Windows), за винятком того, що я використовую * nix (Ubuntu та FreeBSD, окремо). Просто підводячи підсумки, використовуючи оболонку (Bash, CSH тощо), як я масу перейменувати таку кількість файлів, як, наприклад, такі файли:

Бетховен - Хутро Еліза.mp3
Бетховен - Місячна соната.mp3
Бетховен - Ода радості.mp3
Бетховен - Ярость над втраченою копійкою.mp3

буде перейменовано, як ці?

Fur Elise.mp3
Місячна соната.mp3
Ода радістю. Ярості
над втраченою копійкою.mp3

Я хочу зробити це через те, що ця колекція файлів буде знаходитись під каталогом під назвою "Бетховен" (тобто префікс файлів), і наявність цієї інформації про саме ім'я файлу буде зайвим.

Відповіді:


12

Утиліта перейменування зробить те, що ви хочете.

Просто використовуйте rename 's/Beethoven\ -\ //g' *.mp3


Чи можете ви редагувати, щоб надати посилання на утиліту, або це стандарт у обох згаданих дистрибутивах (Ubuntu та FreeBSD)?
Кріс В. Реа

1
Він поставляється з Perl. Debian використовує це як команду перейменування, тому я підозрюю, що Ubuntu теж робить це. Існує ще одна команда "перейменувати", яка нічого не потрібна, тому перевірте сторінку "man".
дероберт

уау, синтаксис перейменування виглядає дуже схожим на заміну vim: D
Dzung Nguyen

порт у / usr / ports / sysutils / rename чудово працював у FreeBSD
Josh W.

10

Як і так багато речей з Linux / Unix, існує кілька способів зробити це!

Деякі можуть використовувати mmv (маса mv).

Команда перейменувати або перейменувати, яка постачається з деякими пакетами Perl (новіші Ubuntu та Debian), може це зробити також.

prename 's/Beethoven\ -\ //g' Beethoven*.mp3

Зауважте, що інструмент перейменування у Fedora 10 - це не та сама програма, як ця і працює по-іншому. Він є частиною іншого пакету, util-linux-ng, і його можна знайти тут .

Я часто просто переходжу до оболонки за звичкою (адже такі інструменти існували не завжди).

mkdir -p Beethoven
for x in Beethoven\ -\ *
do
mv "$x" Beethoven/"${x/Beethoven - /}"
done

Це створить каталог Бетховена, а потім перемістить файл у той каталог / ім'я файлу, де ім'я файлу "Бетховен -" замінено нічим.

Як тест, перед:

$ ls
Beethoven - Fur Elise.mp3                 Beethoven - Ode to Joy.mp3
Beethoven - Moonlight Sonata.mp3          Beethoven - Rage Over the Lost Penny.mp3

Після:

$ ls Beethoven/
Fur Elise.mp3                 Ode to Joy.mp3
Moonlight Sonata.mp3          Rage Over the Lost Penny.mp3

4

Спробуйте це рішення, реалізоване за допомогою комбінації grep та перейменування. Це передбачається, що у вас є ціла купа каталогів, які вам потрібно перейменувати. Якщо їх всього декілька, я б підходив до підходу вручну, з твердим кодом "Художник -" для кожного.

# Rename any mp3 files in the directory hierarchy of type "a - b.mp3" to "b.mp3"
find . -name "*.mp3" -exec rename -n -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;

Пояснення знаходження :
Команда find знаходить усі файли з розширенням .mp3 у поточній ієрархії файлів та викликає аргумент, переданий на -exec для кожного. Зверніть увагу , що в -exec , {} відноситься до аргументу , прийнятої знахідкою (шлях до файлу + ім'я). У \;Гарантує ;отримує передається перейменувати і замість того , що вказує на кінець знахідки команди.

Команда, наведена вище, має перемикач -n (без дії); отже, він скаже тобі тільки, що станеться, якби ти керував ним. Рекомендую запустити цю команду без перемикача -n лише після того, як ви її запустили один раз і будете задоволені запропонованими результатами.

Тепер про регулярний вираз.

  • ^ відповідає початку рядка.
  • $ відповідає кінці рядка.
  • . відповідає будь-якому символу.
  • *означає нуль або більше попередньої конструкції. наприклад .*означає нуль або більше символів.
  • \s означає будь-який космічний персонаж.
  • \S означає будь-який непросторовий персонаж.
  • Все , що всередині ()отримує захоплені і відбивається як $1, $2в залежності від його положення.

Регепс:

  • Шукає необов'язкові структури каталогів на початку, фіксує це в $ 1: (.*/)
  • Пропускає все до " -":.*-
  • Захоплює решту рядка, виключаючи провідні та кінцеві пробіли, у $ 2: (.*)
  • Переписує файл у розмірі $ 1 $ 2, який має бути "/path/to/file/""filename.mp3"

Ось мій тестовий пробіг:

/tmp/test$ ls -R
.:
a  b  c  z-unknown.mp3

./a:
a3.mp3                 a - longer title3.mp3  c.mp3   disc2
a - longer title2.mp3  a - long title.mp3     disc 1  the band - the title.mp3

./a/disc 1:
a - title1.mp3  a - title2.mp3

./a/disc2:
a - title1.mp3  a - title2.mp3

./b:
cd - ab - title3.mp3  cd - title1.mp3  cd - title2.mp3  c.mp3

./c:
c-pony2.mp4  c - pony3.mp3  c - pony4.mp3  c-pony.mp3

/tmp/test$ find . -name "*.mp3" -exec rename -v 's|^(.*/).*-\s*(.*)\s*$|$1$2|g' {} \;
./c/c-pony.mp3 renamed as ./c/pony.mp3
./c/c - pony4.mp3 renamed as ./c/pony4.mp3
./c/c - pony3.mp3 renamed as ./c/pony3.mp3
./z-unknown.mp3 renamed as ./unknown.mp3
./a/the band - the title.mp3 renamed as ./a/the title.mp3
./a/a - longer title2.mp3 renamed as ./a/longer title2.mp3
./a/a - longer title3.mp3 renamed as ./a/longer title3.mp3
./a/disc 1/a - title1.mp3 renamed as ./a/disc 1/title1.mp3
./a/disc 1/a - title2.mp3 renamed as ./a/disc 1/title2.mp3
./a/a - long title.mp3 renamed as ./a/long title.mp3
./a/disc2/a - title1.mp3 renamed as ./a/disc2/title1.mp3
./a/disc2/a - title2.mp3 renamed as ./a/disc2/title2.mp3
./b/cd - title1.mp3 renamed as ./b/title1.mp3
./b/cd - title2.mp3 renamed as ./b/title2.mp3
./b/cd - ab - title3.mp3 renamed as ./b/title3.mp3

/tmp/test$ ls -R
.:
a  b  c  unknown.mp3

./a:
a3.mp3  c.mp3  disc 1  disc2  longer title2.mp3  longer title3.mp3  long title.mp3  the title.mp3

./a/disc 1:
title1.mp3  title2.mp3

./a/disc2:
title1.mp3  title2.mp3

./b:
c.mp3  title1.mp3  title2.mp3  title3.mp3

./c:
c-pony2.mp4  pony3.mp3  pony4.mp3  pony.mp3

Regexp - це складний бізнес, і я зробив багато помилок, написавши їх, тому я вітаю будь-які дані про відсутність заслуги цього. Я знаю, що я знайшов це дуже багато тестування.


1

Я склав програму Java командного рядка, яка робить перейменування файлів (і каталогів) легким вітром, особливо для сценаріїв. Це безкоштовний та відкритий код, тому ви можете змінити його на зміст серця:

RenameWand
http://renamewand.sourceforge.net/

Деякі відповідні приклади використання:

Перемістіть файли форми "<a> - <b>"у відповідний каталог "<a>":

java -jar RenameWand.jar  "<a> - <b>"  "<a>/<b>"

Сортуйте файли за останнім зміненим часом та перейменуйте їх за допомогою тризначного числа:

java -jar RenameWand.jar  "<a>"  "<3|#FT> <a>"

Переставіть частини імені файлу та змініть регістр:

java -jar RenameWand.jar  "<album> - <artist> - <song>.<ext>" 
                          "<artist.upper> <album.title> - <song>.<ext.lower>"

1

zmv Інструмент zsh для перейменування дуже хороший.

# zmv "programmable rename"
# Replace spaces in filenames with a underline
zmv '* *' '$f:gs/ /_'
# Change the suffix from *.sh to *.pl
zmv -W '*.sh' '*.pl'
# lowercase/uppercase all files/directories
$ zmv '(*)' '${(L)1}' # lowercase
$ zmv '(*)' '${(U)1}' # uppercase

Більше приміток тут ...


0

Для голів пінгвінів це легко зробити в сценарії оболонки або в сценарії AWK. Для нас, просто смертних, ви можете спробувати півночі командира. Це в більшості дистрибутивів Linux, із запиту на оболонку типу mc -a. Ви можете перейменовувати файли, використовуючи регулярні вирази. Я використав цю статтю на веб- сайті GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/, щоб допомогти мені.


0

Ось простий приклад командного рядка. У мене було слово "білий" посеред назв купи файлів png. Я хотів вийняти це і залишити лише одну підкреслення. Це зробило трюк:

for i in *.png; do mv "$i" "${i/white/}"; done

0

Використовуйте vidir, а потім скористайтеся функціями редактора, щоб застосувати шаблон перейменування.

ІМ’Я

vidir - редагувати каталог

СИНОПИС

vidir [--verbose] [каталог | файл | -] ...

ОПИС

vidir дозволяє редагувати вміст каталогу в текстовому редакторі. Якщо каталог не вказаний, поточний каталог редагується.

Під час редагування каталогу кожен елемент у каталозі з’явиться у власному нумерованому рядку. Ці цифри - це те, як vidir відстежує, які елементи змінюються. Видаліть рядки, щоб видалити файли з каталогу, або відредагуйте назви файлів для перейменування файлів. Ви також можете переключити пари чисел, щоб поміняти файли.

Зауважте, що якщо "-" вказано як каталог для редагування, воно зчитує список імен файлів із stdin та відображає ті для редагування. Як варіант, список файлів можна вказати в командному рядку.

ПРИКЛАДИ

vidir vidir * .jpeg Типове використання.

знайти | vidir - Змініть також вміст підкаталогу. Щоб видалити підкаталоги, видаліть весь їхній вміст і сам підкаталог у редакторі.

знайти -тип f | vidir - Редагування всіх файлів у поточному каталозі та підкаталогах.

АВТОР

Joey Hess 2006-2010

Модифікації Magnus Woldrich 2011

ПРАВО

Авторські права 2006-2011 на видир "АВТОР", як зазначено вище.

Ліцензується відповідно до GPL GPL.


0

На * Нікс без Perl renameдоступний

У деяких * nix перейменування немає, тому перейменувати потрібно, використовуючи якийсь інший метод. Кілька років тому я запропонував zmvтут, що, хоч і чудово, теж не обов'язково доступне.

Використовуючи вбудовані та sed, ми можемо швидко пробити скрипт оболонки, щоб зробити це, що дає нам дуже схожий синтаксис із сценарієм перейменування perl, не маючи певної помилки обробки помилок, і це робить роботу.

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      mv -v "$file" "$(sed $sed_pattern <<< $file)"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

Використання

sedrename 's/Beethoven\ -\ //g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Скажімо, ми також хотіли створити цільові папки ...

Оскільки mvпапки не створюються, ми не можемо використовувати sedrenameїї як тут, але це досить невелика зміна, тому я вважаю, що було б непогано включити і її.

Нам потрібна функція утиліти abspath(або абсолютний шлях), щоб ми могли генерувати цільову папку для шаблону sed / rename, що включає нову структуру папок.

abspath () { case "$1" in
               /*)printf "%s\n" "$1";;
               *)printf "%s\n" "$PWD/$1";;
             esac; }

Це дозволить нам знати назви наших цільових папок. Коли ми перейменовуємось, нам потрібно буде використовувати його в імені цільового файлу.

# generate the rename target
target="$(sed $sed_pattern <<< $file)"

# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"

# finally move the file to the target name/folders
mv -v "$file" "$target"

Ось повний сценарій відомо про папки ...

sedrename() {
  if [ $# -gt 1 ]; then
    sed_pattern=$1
    shift
    for file in $(ls $@); do
      target="$(sed $sed_pattern <<< $file)"
      mkdir -p "$(dirname $(abspath $target))"
      mv -v "$file" "$target"
    done
  else
    echo "usage: $0 sed_pattern files..."
  fi
}

Звичайно, він все ще працює, коли у нас теж немає конкретних цільових папок.

Якщо ми хотіли скласти всі пісні в папку, ./Beethoven/ми можемо зробити це:

Використання

sedrename 's|Beethoven - |Beethoven/|g' *.mp3

before:

./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3

after:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

Бонусний раунд ...

Використовуючи цей скрипт для переміщення файлів із папок у одну папку:

Припускаючи, що ми хотіли зібрати всі відповідні файли та розмістити їх у поточній папці, ми можемо це зробити:

sedrename 's|.*/||' **/*.mp3

before:

./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3

after:

./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3

Зверніть увагу на шаблони регулярного виразки

У цьому сценарії застосовуються регулярні правила шаблону sed, ці шаблони не є PCRE (сумісні з Perl регулярні вирази). Ви можете мати синтаксис регулярного регулярного вираження, використовуючи sed -rабо sed -E залежно від вашої платформи.

Дивіться сумісність POSIX, man re_formatщоб отримати повний опис базових та розширених моделей регулярних викидів.

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