Переименование файла оптимизации bash-скрипта

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

У меня есть папка с именем "unrar", там есть подпапки с неизвестным именем папки с файлом rar внутри. Теперь я вхожу в неизвестную подпапку, нахожу файл rar и распаковываю его в неизвестную подпапку. После этого я нахожу новый файл и переименовываю его с неизвестным именем. Теперь я беру файл и перемещаю его в./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 в DIR и разархивировать его. новый файл.(.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

если case2, в моем скрипте 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 в одну строку.

С уважением, вомбат

(РЕДАКТИРОВАТЬ: для лучшего понимания)

1 ответ

ОБНОВИТЬ:

Я настроил решение для работы с 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 в качестве первого параметра, иначе вы получите ошибку. В случае ОП это будет /home/user/unrar, omitfolder это не путь, это просто имя папки, которую вы хотите опустить. Так что в случае ОП это будет sample,

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

По просьбе OP в комментариях вы можете прочитать о встроенной функции чтения и подстановке bash, чтобы понять, как while -loop работает и как он назначает имена файлов, возвращаемые find к переменной f,

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