2015-11-07 2 views
1

Я написал сценарий оболочки, который в основном ищет файлы rar и развязывает их.Проверьте, существует ли файл в заданном каталоге, НЕ подкаталоги

Чтобы избежать разрыва одного и того же файла несколько раз, я добавил чек для типа файлов, которые я буду отрывать, а именно: * .avi, * .mkv и * .mp4.

find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do 
    DIR=$(dirname "${file}") 
    MKV=$(find "${DIR}" -name "*.mkv" -print0) 
    AVI=$(find "${DIR}" -name "*.avi" -print0) 
    MP4=$(find "${DIR}" -name "*.mp4" -print0) 
    if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
      printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log 
      sudo unrar e "${file}" 
      MKV=$(find "${DIR}" -name "*.mkv" -print0) 
      AVI=$(find "${DIR}" -name "*.avi" -print0) 
      MP4=$(find "${DIR}" -name "*.mp4" -print0) 
      if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
        printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
      else 
        printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
      fi 
    else 
      printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log 
    fi 
done 

Теперь проблема в том, что большинство, если не все, каталоги имеют «Sample» подкаталог с видеофайла в нем. Этот файл будет помечен моей текущей реализацией, чего я не хочу.

Я хочу, чтобы он смотрел точный каталог, $DIR, а не его подкаталоги.

В настоящее время я сделал обходной путь, где я просто удаляю каталог образца, если он существует, но это прерывает потоки.

Я попытался немного поэкспериментировать с -wholename, но я не нашел ничего, что сработает.

Любая помощь приветствуется.

С уважением, Йохан

+1

Проверьте страницу руководства для «найти» в вашей системе - говорит мой : -maxdepth levels. Спускаются на большинстве уровней (неотрицательных целых) уровней каталогов ниже аргументов командной строки. -maxdepth 0 означает только применить тесты и действия к аргументам командной строки. " –

ответ

2

Используйте опцию -maxdepth, чтобы ограничить поиск в текущем каталоге.

MKV=$(find "${DIR}" -name "*.mkv" -print0 -maxdepth 0) 
AVI=$(find "${DIR}" -name "*.avi" -print0 -maxdepth 0) 
MP4=$(find "${DIR}" -name "*.mp4" -print0 -maxdepth 0) 
2

Ответ charlton_austin был ответом. Однако это было -maxdepth 1.

Полный сценарий:

find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do 
    DIR=$(dirname "${file}") 
    cd "${DIR}" 
    MKV=$(find . -maxdepth 1 -name "*.mkv" -print0) 
    AVI=$(find . -maxdepth 1 -name "*.avi" -print0) 
    MP4=$(find . -maxdepth 1 -name "*.mp4" -print0) 
    if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
      printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log 
      sudo unrar e "${file}" 
      MKV=$(find . -maxdepth 1 -name "*.mkv" -print0) 
      AVI=$(find . -maxdepth 1 -name "*.avi" -print0) 
      MP4=$(find . -maxdepth 1 -name "*.mp4" -print0) 
      if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then 
        printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
      else 
        printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
      fi 
    else 
      printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log 
    fi 
done 
0

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

if [[ "$(ls ./*.{mkv,avi,mp4} 2> /dev/null)" != "" ]]; then 
    echo "exists" 
else 
    echo "fail" 
fi 
0

find Здесь нет необходимости, так как вы ищете только для файлов с заданное расширение в указанном каталоге. Просто заполните массив, используя шаблон. Не кажется, что вам нужно хранить файлы разного типа отдельно; вы просто проверяете, что что-то получили unarchived.

cd "$DIR" 
files=("$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4) 
if ((${#files[@]} == 0)); then 
    printf "UNRARING $DIR\n" >> /home/johan/unrarer.log 
    sudo unrar e "$file" 
    files=("$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4) 
    if ((${#files[@]} == 0)); then 
     printf "UNRAR FAILED\n" >> /home/johan/unrarer.log 
    else 
     printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log 
    fi 
else 
    printf "$DIR: Found an mov, avi, or mp4 file, skipping\n" >> /home/johan/unrarer.log 
fi 

Если вы используете bash 4 или более поздней версии, вам не нужно использовать find, чтобы найти файлы RAR либо:

shopt -s globstar 
for file in "/mnt/media1/TV Shows/"**/*.rar; do 
    ... 
done