簡體   English   中英

檢查文件是否存在於給定目錄中,而不是子目錄中

[英]Check if a file exists in a given directory, NOT subdirectories

我寫了一個shell腳本,該腳本基本上查找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 ,而不是其任何子目錄。

目前,我已經采取了一種解決方法,如果存在Sample目錄,我將其簡單地刪除,但這會破壞種子。

我曾嘗試使用-wholename進行實驗,但沒有找到任何有效的方法。

任何幫助表示贊賞。

問候,約翰

使用-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)

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

您可以提前進行遍歷:

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

在這里不必find ,因為您只在指定目錄中查找具有給定擴展名的文件。 只需使用模式填充數組。 似乎不需要將不同類型的文件分開; 你只是檢查了東西未存檔。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM