Переименование файла оптимизации 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
,