Я модифицирую простой скрипт BASH, чтобы удалить цифры и дефисы из начала моих файлов MP3. Цель состоит в том, чтобы переименовать файлы, такие как:
до:
У меня есть этот скрипт, который работает для всех файлов в текущем каталоге
$ for f in [0-9]*; do mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`"; done
и изменил его, чтобы искать все файлы внутри подпапок:
#!/bin/bash
dir=''
IFS='
'
for f in $(find $dir * -type f) ; do
mv "$f" "`echo $f | sed 's/^[0-9]*\W*//'`";
done
Проблема в том, что значение $f
возвращает подпапку, а имя файла и строка mv
ищет файлы, начинающиеся с [0-9], поэтому любые файлы в подпапке не переименовываются.
например. Файл mp3/1-1 Song 1.mp3
начинается с mp3/
, не начинается с цифры, поэтому он не переименовывается.
Есть ли способ, которым я могу прочитать значения каталогов и файлов в отдельные переменные или есть лучший способ сделать это?
Спасибо
Там нет необходимости для сценария, есть один вкладыш для этого.
Попробуйте, чтобы увидеть, что он делает (не волнуйтесь, это еще не переименовывает ваши файлы, см. Ниже):
find root_audio_path -type f -iname '*mp3' -execdir rename --no-act 's/^\.\/[\d\s\-]+/\.\//' '{}' ';'
Удалите --no-act
, если кажется, что это работает. Это на самом деле переименовывает файлы.
Опция -execdir
в find
обеспечивает выполнение rename
в каталоге файлов, поэтому пути к файлам всегда начинаются с ./
, что мы и ищем в rename
.
rename
в Ubuntu фактически переименовывает perls, так что вы можете использовать там регулярные выражения.
Следующее даст вам путь
echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)\(.*\)#\1#g'
/wwww/www/mp3/
Следующее даст вам файл без пути:
echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)##g'
1-1 Song 1.mp3
Вам потребуется переменная для пути, old и новые имена файлов. Вы можете получить новое имя файла, используя ваш код, и построить исходный и целевой путь, используя эти переменные. Я бы порекомендовал сделать пробный прогон, когда вы повторяете цель, добавляя в файл. Тогда вы можете проверить на д
найти и sed: Я бы попросил вас сначала удалить pipe и sh в конце, и посмотреть, правильно ли генерируется команда mv, а затем вы можете запустить команду так:
find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\1\2\"|' | sh