2016-09-18 3 views
1

Вот текущая структура папок:Как удалить все не-числовые символы из файла рекурсивно

/home/ubuntu/Desktop/pictures/ 
/home/ubuntu/Desktop/pictures/folder1 
/home/ubuntu/Desktop/pictures/folder1/John Doe - 1234567.JPG 

/home/ubuntu/Desktop/pictures/folder2 
/home/ubuntu/Desktop/pictures/folder2/Homer Simpson - 7654321.jpg 
/home/ubuntu/Desktop/pictures/folder2/Lisa Simpson - 321456.jpg 

/home/ubuntu/Desktop/pictures/folder3 
/home/ubuntu/Desktop/pictures/folder3/Foo Bar - 234123.JPG 
/home/ubuntu/Desktop/pictures/folder3/Bar Foo - 876542.JPG 

Что я хочу, чтобы создать сценарий, который бы цикл через все папки в «картинки» и переименуйте все файлы «JPG» и «jpg» в их числовые значения, чтобы имя файла «John Doe - 1234567.JPG» превратилось в «1234567.JPG».

я попробовать оболочки сценариев, но я получил это работает только тогда, когда JPG файлы находятся в одной папке:

[email protected]:~/Desktop/pictures/in_one_folder$ ls 
John Doe - 1234567.JPG   Foo Bar - 234123.JPG 
Homer Simpson - 7654321.jpg  Bar Foo - 876542.JPG 
Lisa Simpson - 321456.jpg  script.sh 

работы этого сценария:

for f in *JPG *jpg; 
do 
     file=$f 
     remove_non_numeric=$(echo "$file" | sed 's/[^0-9]*//g') 
     add_extension="$remove_non_numeric.jpg" 
     echo "$add_extension" 
     mv "$file" "$add_extension" 
done 

И вот результат:

[email protected]:~/Desktop/pictures/in_one_folder$ ls 
1234567.jpg  234123.jpg 
7654321.jpg  876542.jpg 
321456.jpg  script.sh 

Так что это делало то, что предполагалось. Теперь вопрос в том, как я могу настроить его на цикл через папки. Или, если нет способа изменить код, который я придумал (новичок пытается учиться, ха-ха), тогда я буду признателен за другие способы достижения результата. Хотя я пытаюсь получить эту работу в Linux, подход Windows тоже будет прекрасен.

Спасибо за помощь!

ответ

2

Вот вы код регулировать работу рекурсивно:

topdir=~/"Desktop/pictures/in_one_folder" 
find "$topdir" -type f -iname '*.jpg' -print0 | 
    while IFS= read -r -d '' path; do 
     dir="${path%/*}" 
     file="${path##*/}" 
     remove_non_numeric=$(echo "$file" | sed 's/[^0-9]*//g') 
     add_extension="$remove_non_numeric.jpg" 
     echo "$dir/$add_extension" 
     mv "$path" "$dir/$add_extension" 
    done 

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

Один из способов сделать это немного быстрее, избегая использования sed. Вы можете удалить ненулевые символы с чистым bash следующим образом:

 remove_non_numeric="${file//[^0-9]/}" 
Смежные вопросы