7

Я облажался и случайно есть куча файлов с расширением .mp3.mp3.mp3.mp3

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

3 ответа3

16

Существует довольно простое решение, которое состоит в том, чтобы просто отключить все, начиная с первого «.mp3», а затем снова добавить «.mp3». Так:

for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
4

Использование утилиты rename , поставляемой с perl (в некоторых системах она может называться perl-rename ), и оболочки с ** (zsh или bash с shopt -s globstar , среди прочих):

rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
2

Используя команду find в bash и некоторые творческие сценарии, это можно волшебным образом очистить. Следующие скрипты были протестированы на Mac OS X 10.9.5, но также должны нормально работать на Linux. Сначала запустите это как «пробный запуск», чтобы убедиться, что вы выбираете нужные файлы:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    echo "mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3"
  done

Сначала вы должны изменить /path/to/your/files чтобы он соответствовал фактическому пути к уязвимым файлам в системе. Также обратите внимание на последнюю строку, которая является echo команды mv (move). Я делаю это, чтобы убедиться, что скрипт нацелен на правильные файлы.

Основная логика find такова:

find '/path/to/your/files' -type f -name '*.mp3.mp3*'

Что в основном означает: «Найдите все файлы в пути /path/to/your/files , которые на самом деле являются файлами (а не каталогами) с шаблоном имени файла, соответствующим *.mp3.mp3* . Это должно перехватить любые / все файлы, к которым прикреплено более одного .mp3 ; .mp3.mp3 , .mp3.mp3.mp3 , .mp3.mp3.mp3.mp3 , .mp3.mp3.mp3.mp3.mp3 и т. д.

Сценарий не будет работать с файлами, которые имеют правильный .mp3 что, безусловно, дает преимущество в скорости, если у вас есть только небольшое подмножество файлов с .mp3.mp3.mp3.mp3 вместо того, чтобы переименовывать все файлы .mp3 .

Поэтому, когда вы запустите эту программу, вы увидите список команд mv « пробного запуска», которые решат вашу проблему: найдите все эти несколько файлов .mp3 и переименуйте их в правильный, единственный файл .mp3 .

Теперь, когда это хорошо работает, просто запустите финальный скрипт следующим образом:

find '/path/to/your/files' -type f -name '*.mp3.mp3*' |\
  while read RAW_FILE
  do
    DIRNAME=$(dirname "$RAW_FILE")
    BASENAME=$(basename "$RAW_FILE")
    FILENAME="${BASENAME%%.*}"
    EXTENSION="${BASENAME#*.}"
    mv "${RAW_FILE}" "${DIRNAME}/${FILENAME}".mp3
  done

Обратите внимание, что последняя строка является действительной, функциональной командой mv . Когда вы запускаете эту версию скрипта, во всем каталоге будет выполняться поиск этих нескольких файлов .mp3 а затем фактически запускается полная команда mv чтобы решить эту проблему.

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