Рекурсивное удаление чисел и дефисов из имен файлов

Я модифицирую простой скрипт BASH, чтобы удалить цифры и дефисы из начала моих файлов MP3. Цель состоит в том, чтобы переименовать файлы, такие как:

  • 11 Song 1.mp3
  • 1-1-Song 2.mp3
  • 11-1 Song 3.mp3

до:

  • Песня 1.mp3
  • Песня 2.mp3
  • Песня 3.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/, не начинается с цифры, поэтому он не переименовывается.

Есть ли способ, которым я могу прочитать значения каталогов и файлов в отдельные переменные или есть лучший способ сделать это?

Спасибо

7
задан 16 October 2012 в 16:35

3 ответа

Там нет необходимости для сценария, есть один вкладыш для этого.

Попробуйте, чтобы увидеть, что он делает (не волнуйтесь, это еще не переименовывает ваши файлы, см. Ниже):

find root_audio_path -type f -iname '*mp3' -execdir rename --no-act 's/^\.\/[\d\s\-]+/\.\//' '{}' ';'

Удалите --no-act, если кажется, что это работает. Это на самом деле переименовывает файлы.

Опция -execdir в find обеспечивает выполнение rename в каталоге файлов, поэтому пути к файлам всегда начинаются с ./, что мы и ищем в rename.

rename в Ubuntu фактически переименовывает perls, так что вы можете использовать там регулярные выражения.

0
ответ дан 16 October 2012 в 16:35

Следующее даст вам путь

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 и новые имена файлов. Вы можете получить новое имя файла, используя ваш код, и построить исходный и целевой путь, используя эти переменные. Я бы порекомендовал сделать пробный прогон, когда вы повторяете цель, добавляя в файл. Тогда вы можете проверить на д

0
ответ дан 16 October 2012 в 16:35

найти и sed: Я бы попросил вас сначала удалить pipe и sh в конце, и посмотреть, правильно ли генерируется команда mv, а затем вы можете запустить команду так:

find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\1\2\"|' | sh
0
ответ дан 16 October 2012 в 16:35

Другие вопросы по тегам:

Похожие вопросы: