2013-06-13 2 views
0

У меня есть большой репозиторий медиафайлов, которые следуют соглашениям об именах торрентов - что-то неприятное для чтения. В какой-то момент я правильно назвал папки, содержащие указанные файлы, но не хочу выгружать все файлы .avi, .mkv и т. Д. В мой основной медиа-каталог, используя сценарий bash.Переименовать файлы в папках в имена папок при сохранении расширений

Обзор: Текущий дерево каталогов:

Proper Movie Title/ 
->Proper.Movie.Title.2013.avi 
->Proper.Movie.Title.2013.srt 
Title 2/ 
->Title2[proper].mkv 
Movie- Epilogue/ 
->MOVIE EPILOGUE .AVI 
Media Movie/ 
->MEDIAMOVIE.CD1.mkv 
->MEDIAMOVIE.CD2.mkv 

. . .

Желаемая дерево каталогов:

Proper Movie Title/ 
->Proper Movie Title.avi 
->Proper Movie Title.srt 
Title 2.mkv 
Movie- Epilogue.avi 
Media Movie/ 
->Media Movie.cd1.mkv 
->Media Movie.cd2.mkv 

Хотя это было бы идеальным, мое главное пожелание для каталогов с только один файл фильма в иметь этот файл будет переименован и перемещен в родительский каталог.

Мой нынешний подход заключается в использовании цикла double для файла в формате .sh, но в настоящее время я с трудом сохраняю новое знание bash в своей голове.

Справка будет принята с благодарностью.

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

#!/bin/bash 
FILES=./* 
for f in $FILES 
do 
     if [[ -d $f ]]; then 
       INFILES=$f/* 
       for file in $INFILES 
       do 
         echo "Processing >$file< folder..." 
       done 
     #cat $f 
     fi 
done 
+1

Быстрое решение - сказать «нет» пиратству! Купите фильмы, и у них будут соответствующие названия. –

+0

Покажите, что вы пробовали, мы не здесь, чтобы написать ваш код для вас. – Barmar

+0

Добавлен код, о котором я думаю. – SWPhantom

ответ

3

Вот что-то простое:

find * -type f -maxdepth 1 | while read file 
do 
    dirname="$(dirname "$file")" 
    new_name="${dirname##*/}" 
    file_ext=${file##*.} 
    if [ -n "$file_ext" -a -n "$dirname" -a -n "$new_name" ] 
    then 
     echo "mv '$file' '$dirname/$new_name.$file_ext'" 
    fi 
done 

find * говорит, чтобы запустить поиск по всем пунктов в Текущий каталог. -type f говорит, что вас интересуют только файлы, а -maxdepth 1 ограничивает глубину поиска ближайшей директорией.

  • The ${file##*.} использует шаблон матч. ## говорит, что наибольшая левая комбинация соответствует *., которая в основном тянет все на расширение файла.
  • file_dir="$(dirname "$file")" получает имя каталога.
  • Примечание котировки везде! Вы должны быть осторожны с пробелами.

Кстати, I echo вместо фактического перемещения. Я могу передать вывод в файл, проверить этот файл и убедиться, что все выглядит нормально, а затем запустить этот файл в качестве сценария оболочки.

+0

Это замечательно, Дэвид. Большое спасибо. Есть ли верный способ определить, сколько файлов находится в каталоге? Команда «| wc», похоже, не возвращает количество файлов, а возвращает количество слов в каталоге. Я хотел бы иметь условие, которое выполняет только данный код, если в каталоге есть <= 2 файла. – SWPhantom

+0

@SWPhantom Команда 'wc -l' вернет _lines_, а не слова. См. 'Man wc' для всех различных опций. –

Смежные вопросы