Как очистить расширения файлов?

9

У меня есть каталоги с файлами .MP3, которые я хотел бы изменить на .mp3. Какой самый простой способ сделать это? Я думаю, что-то вроде:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... хотя я знаю, что это не совсем правильно. :) Подстановка неверна, и я не уверен, как использовать a mvи sedкоманду с -execin find.

Нужен ли для этого скрипт bash?

Калеб
источник

Ответы:

12

Вот один из способов сделать это в Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Я использовал echoздесь, чтобы сама команда ничего не делала, кроме печати пар имен файлов. Если этот список представляет изменения, которые вы хотите внести, то вы можете изменить echoчто-то подобное, mv -i --что затем переместит ваши файлы (и предложит вам перед перезаписью).

Краткое объяснение:

В forперебирает каждый файл соответствует по *. Затем мы определяем, является ли расширение уже нижним регистром, если оно движется дальше, если нет, мы продолжаем его перемещать (или отображать его, в зависимости от обстоятельств). Здесь используются встроенные строковые операции Bash, о которых вы можете прочитать здесь: http://tldp.org/LDP/abs/html/string-manipulation.html

Стивен Д
источник
Спасибо за ваш ответ и указание на ссылку на манипуляцию строк bash!
7

В зш:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Чтобы также заботиться .Mp3или .mP3файлы:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
Жиль "ТАК - перестань быть злым"
источник
6

Вы можете использовать команду переименования (имейте в виду, что есть две основные реализации с разными API). Например, чтобы изменить регистр расширений имен файлов с верхнего на нижний, попробуйте следующее:

  • с renamefrom util-linux(иногда вызывается rename.ul), предполагая, что .JPGвстречается только один раз в именах файлов

    rename -- .JPG .jpg *.JPG
  • с renameиз perl(иногда называемый prename; несколько вариантов были опубликованы):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Вот руководство для некоторых ребят о том, как он перешел от грязного скрипта bash к этой простой команде именно для вашего случая использования.

Еще одна причудливая команда для этого pax. Если вы используете ZSH для своей оболочки, вы также можете использовать zmv.

Калеб
источник
супер! именно то, что мне нужно
JoshP
Я получаю ошибку syntax error at (user-supplied code), near ".", когда я запускаю эту команду.
Райан Гейтс
3

Используйте perl-rename , швейцарский армейский нож для переименования файлов с регулярными выражениями (в ubuntu это связано с пакетом perl в качестве имени):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Если вы осторожны, используйте опции -n и -v для переименования perl, чтобы увидеть, что он на самом деле сделает.

Кжетил Йоргенсен
источник
Спасибо за Ваш ответ. У меня нет perlrename на сервере, но я собираюсь поиграть с этим позже сегодня!
0

Вам нужен скрипт, потому что «расширения» в Linux - это на самом деле просто части строки имени файла. Вы должны выполнить некоторые манипуляции со строками в скрипте, чтобы получить новое имя.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

Двойные кавычки важны, если у вас есть имена файлов с пробелами в них. Я думал, что некоторые из двойных кавычек были немного неочевидны.

Брюс Эдигер
источник
1
В вашем сценарии нет ничего плохого, но вам совершенно не нужен сценарий для этого. Существует, вероятно, дюжина способов сделать это в одной строке в большинстве оболочек, а также множество утилит, облегчающих эту задачу.
Калеб
0

В Баш:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done
Максим Р.
источник
0

сначала сделайте резервную копию ваших файлов! Вы можете использовать однострочник Python:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

РЕДАКТИРОВАТЬ:

Вот подробное объяснение того, как на самом деле работает однострочник. Используя python -cмы передаем команду интерпретатору python. После импорта библиотек osдля renameфункции и globдля списка файлов нам нужно перебрать список файлов в данном каталоге, который я назвал PATH_TO_YOUR_DIRECTORY, например, что-то вроде ./*для всего в текущем каталоге.

К сожалению, в однострочном синтаксисе forциклы не работают после importнотации, поэтому нам нужно использовать скобочную нотацию. Т.е. для каждого имени файла или каталога, globкоторое дает нам по указанному пути в виде строки, мы заменяем * .MP3 на * .mp3.

Поскольку OP не упоминал рекурсивный поиск, я не включил его в первую очередь.

xaratustra
источник