2016-07-03 4 views
4

я в общей сложности нуб, но я понял, этот скрипт для выполнения следующих действий:Баш файл оптимизации сценария переименования

У меня есть папка под названием «UnRAR» в есть вложенные папки с неизвестным FOLDERNAME с RAR файла внутри. Теперь я вхожу в unknownsubfolder, нахожу rar-файл и разворачиваю его в unknownsubfolder. После этого я нахожу новый файл и переименовываю его с именем unknownsubfolder. Теперь я хватаю файл и перемещаю его в ./unrar.

#!/bin/bash 

cd /home/user/unrar/ 

for dir in /home/user/unrar/*; 
    do (cd "$dir" && find -name "*.rar" -execdir unrar e -r '{}' \;); done 

echo "$(tput setaf 2)-> unrar done!$(tput sgr0)" 

for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mkv" -exec mv '{}' "${PWD##*\/}.mkv" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mp4" -exec mv '{}' "${PWD##*\/}.mp4" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.avi" -exec mv '{}' "${PWD##*\/}.avi" \;); done 

cd /home/user/unrar 
find -name "*.mkv" -exec mv '{}' /home/user/unrar \; 
find -name "*.mp4" -exec mv '{}' /home/user/unrar \; 
find -name "*.avi" -exec mv '{}' /home/user/unrar \; 

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

Я хочу найти * .rar в ОДН и UnRAR него. новый файл. (.mkv | .avi | .mp4) должен быть переименован в DIR (.mkv | .avi | .mp4) и перенесен в ./unrar

Это моя филеструктура.

./unrar/ 
    - unknownsubfolder/ 
     -file.rar 
     -file.r00 
     -.... 
    - unknownsubfolder1/ 
     - s01/ 
      - file.rar 
      - file.r00 
      - .... 
     - s02/ 
      - file.rar 
      - file.r00 
      - .... 
     - .... 

Если case1, UnRAR "/unknownsubfolder/file.rar" и получить "x.mkv". файл переименован из "x.mkv" до "unknwonsubfolder.mkv" и переехал в "./unrar/unknownsubfolder.mkv" (то же самое с * .avi + * .mp4) == Perfekt

если Случай 2, в моем сценарии unknownsubfolder/s01/file.rar будет неровным, но не переименован в s01.mkv, установленный unknwonsubfolder1.mkv. (если есть больше, как s02, S03, S04 ...) я всегда в конечном итоге с одним unknownsubfolder.mkv файлом в ./unrar) == неправильно выходной

Так я думаю, у меня есть 3 вопроса

Как получить правильное имя DIR для переименования файла? Или как я могу ввести unknownsubfolder/s01 ....?

Есть ли способ исключить слово из поиска? иногда «unknownsubfolder» содержит другую папку + файл с именем «sample (.mkv | .avi | .mp4)». Я хотел бы исключить это, чтобы исходный файл не был перезаписан образцом. иногда бывает.

Я уверен, что могу комбинировать некоторые из кода, чтобы сделать его еще короче. Может ли кто-нибудь объяснить, как это сделать? Итак, как я объединять mkv, avi и mp4 в одной строке.

С уважением, Wombat

(EDIT: для лучшего понимания)

+0

Правильно ли я понимаю, что в проблемном случае у вас есть 30 подпапок внутри неизвестной папки вместо одного rar-файла? Как вы его сформулировали, можно подумать, что это всего лишь одна папка с именем 'subfolder1-30'. Все эти подпапки все еще содержат только один файл rar? – nautical

+0

Право, unknownsubfolder содержит до 30 дополнительных подпапок, каждый из которых содержит сжатый видеоролик в rar. – wombat

ответ

2

UPDATE:

Я настроил решение для работы с unrar. Поскольку у меня не было unrar, установленного ранее, я использовал gunzip для построения решения, а затем просто заменил его на unrar. Проблема с этим подходом заключалась в том, что по умолчанию unrar извлекает текущую рабочую директорию. Другое отличие состоит в том, что имя извлеченного файла может полностью отличаться от имени архива - это не просто вопрос о разных расширениях. Исходный архив также не удаляется после извлечения.

Вот решение специально разработанные для работы с unrar относительно вышеупомянутого поведения:

#!/bin/bash 

path="$1" 
omit="$2" 

while read f;do 
     unrar e -r "${f}" "${f%/*}" > /dev/null 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -print) 

while read f;do 
     new="${f%/*}" 
     new="${new##*/}" 
     mv "${f}" "${path}/${new}" 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -a \! -name '*.rar' -print) 

Вы можете сохранить сценарий, например,Как rename-script (не забудьте сделать его исполняемым), а затем вызвать его как

./rename-script /path/to/unrar omitfolder 

Обратите внимание, что в сценарии нет cd. Вы должны по крайней мере предоставить местоположение папки unrar в качестве первого параметра, иначе вы получите сообщение об ошибке. В случае OP это будет /home/user/unrar. omitfolderне путь, это просто имя папки, которую вы хотите опустить. Таким образом, в случае OP это будет sample.

./rename-script /home/user/unrar sample 

В соответствии с просьбой ОП в комментариях, вы можете прочитать о bash read-builtin и process substitution для того, чтобы понять, как while -loop работает и как он присваивает имена файлов, возвращаемые find переменной f.

+0

Большое спасибо за ваш ответ. прямо сейчас я ничего не беру на себя, но я постараюсь понять это, что и что происходит, и вернуться с лучшей обратной связью. – wombat

+0

Когда я запускаю этот скрипт, я получаю синтаксическую ошибку при «сделанном <<» неожиданном слове. Я могу узнать, что каждая строка делает в этом скрипте, но не совсем то, что означает «read f», а затем «$ {f}». Я предполагаю, что это файл, который я должен разукрасить, но как узнать, что это файл, который нужно распаковать. не могли бы вы это объяснить? – wombat

+0

@wombat Я обновил решение для работы с 'unrar'. Раньше я использовал 'gunzip' и просто заменял его' unrar'. Однако ваша ошибка возникает из-за неправильного вызова сценария. По крайней мере, вы должны указать местоположение папки unrar в качестве первого параметра. Если ваша папка unrar всегда будет в том же месте, и папка omit всегда будет иметь одно и то же имя, вы можете жестко установить оба сценария, изменив «path =»/home/user/unrar »и« omit = sample ». Тогда вы можете просто назвать это без параметров. – nautical

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