检查给定目录中是否存在文件,而不是子目录

时间:2015-11-07 01:26:06

标签: linux bash shell debian

我编写了一个shell脚本,它基本上会查找rar文件并解开它们。

为了避免多次取消同一个文件,我添加了一个检查我将要取消的文件类型,即* .avi,* .mkv和* .mp4。

_.max(_.map(masterArray, function(v, k) { return { id: k, size: v.length }; }),'size').id;

现在,问题是大多数(如果不是全部)目录都有一个" Sample"其中包含视频文件的子目录。这个文件被标记为我当前的实现,这不是我想要的。

我希望它查看确切的目录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目录(如果它存在),但这会破坏种子。

我尝试过使用-wholename进行实验,但我找不到任何有用的东西。

任何帮助表示感谢。

此致 约翰

4 个答案:

答案 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)

答案 1 :(得分: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

答案 2 :(得分:0)

你可以采取全球化的进展:

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

答案 3 :(得分:0)

这里不需要

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