У меня возникла небольшая проблема при извлечении rar-файлов рекурсивно. Я использую эту строку find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r* и, похоже, работает! Но проблема в том, что файлы, которые извлекаются, попадают в текущую рабочую папку. Когда я хочу, чтобы они были извлечены в папке, они были.
Это пример структуры файла, двух папок, Holdiday_pictures_greece и Holdiday_pictures_malta. Они содержат файлы rar (или rar-архивы). Holdiday_pictures_greece.rar и соответствующий архив Holdiday_pictures_greece.r01 Holdiday_pictures_greece.r02 и т. Д.
~$ ls
Holdiday_pictures_greece
Holdiday_pictures_malta
~$ cd Holdiday_pictures_greece
Holdiday_pictures_greece $ ls
Holdiday_pictures_greece.rar
Holdiday_pictures_greece.r01
Holdiday_pictures_greece.r02
Holdiday_pictures_greece $ cd ..
~ $ find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r*
~ $ ls
greece_01.jpg
greece_02.jpg
malta_01.jpg
malta_02.jpg
Как вы можете видеть из моего примера выше, все файлы из обоих архивов (Мальта и Греция) попадают в ~, я запускал скрипт. Ожидаемый результат будет заключаться в том, что они попали в соответствующую папку Holdiday_pictures_malta и Holdiday_pictures_greece. В папках также могут быть подпапки. Пример Holdiday_pictures_greece/2011, содержащий больше rar-файлов.
Я попытался с -execdir, тот же результат, файлы в конечном итоге находятся в текущем каталоге.
Таким образом, ожидаемым результатом будет цикл через все вложенную папку в текущем каталоге, извлеките файлы rar в папку, где они найдены, а затем удалите архив rar.
Это, вероятно, проще сделать с циклом while вместо -exec:
find . -type f -name -name '*.rar' -print0 |
while IFS= read -r -d '' file; do
dir=$(dirname "$file")
rar=$(basename "$file")
cd "$dir"
unrar -e "$rar" && rm "$rar"
cd -
done
Это, вероятно, проще сделать с циклом while вместо -exec:
find . -type f -name -name '*.rar' -print0 |
while IFS= read -r -d '' file; do
dir=$(dirname "$file")
rar=$(basename "$file")
cd "$dir"
unrar -e "$rar" && rm "$rar"
cd -
done