Я облажался и случайно есть куча файлов с расширением .mp3.mp3.mp3.mp3
Как я могу изменить их рекурсивно - и по нескольким каталогам - чтобы установить для них только .mp3
?
Я облажался и случайно есть куча файлов с расширением .mp3.mp3.mp3.mp3
Как я могу изменить их рекурсивно - и по нескольким каталогам - чтобы установить для них только .mp3
?
Существует довольно простое решение, которое состоит в том, чтобы просто отключить все, начиная с первого «.mp3», а затем снова добавить «.mp3». Так:
for file in $(find . -name "*.mp3"); do mv "$file" "${file%%.mp3*}.mp3"; done
Использование утилиты rename
, поставляемой с perl (в некоторых системах она может называться perl-rename
), и оболочки с **
(zsh или bash с shopt -s globstar
, среди прочих):
rename 's/(\.mp3)+$/.mp3/' /somedir/**/*.mp3
Используя команду 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
чтобы решить эту проблему.