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

7

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

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

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

Спасибо

    
задан Stephen Provis 16.10.2012 в 12:14
источник

3 ответа

4

найти & amp; СЭД:   Я бы попросил вас сначала удалить трубку и sh в конце и посмотреть, правильно ли генерируется команда mv, а затем вы можете запустить команду как таковую:

find $dir -type f | sed 's|\(.*/\)[^A-Z]*\([A-Z].*\)|mv \"&\" \"\"|' | sh
    
ответ дан Guru 16.10.2012 в 12:32
источник
2

Нет необходимости в скрипте, для этого есть один лайнер.

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

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

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

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

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

    
ответ дан phoibos 16.10.2012 в 12:56
0

Далее вы получите путь

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)\(.*\)##g'
/wwww/www/mp3/

Ниже вы получите файл без пути:

echo "wwww/www/mp3/1-1 Song 1.mp3" | sed 's#\(.*/\)##g'
1-1 Song 1.mp3

Вам понадобится переменная для путей, старых и новых имен файлов. Вы можете получить новое имя файла, используя свой код, и создать исходный и целевой путь, используя эти переменные. Я бы порекомендовал делать сухую работу, где вы эхо целевого добавления в файл. Затем вы можете проверить d

    
ответ дан Romski 16.10.2012 в 12:32