bash:检查目录是否仅包含特定后缀的文件

时间:2019-04-03 09:44:38

标签: bash directory file-exists

我试图编写一个脚本来检查目录是否仅包含 特定类型的文件(和/或文件夹),将为false返回1,为true返回0。

IE:我要检查/ my / dir /是否仅包含* .gz文件,而没有其他内容。

这是我到目前为止所拥有的,但是它似乎没有按预期工作:

# Basic vars
readonly       THIS_JOB=${0##*/}
readonly       ARGS_NBR=1


declare        dir_in=$1


dir_in=$1"/*.gz"
#echo $dir_in

files=$(shopt -s nullglob dotglob; echo ! $dir_in)
echo $files

if (( ${#files} ))
then
    echo "Success: Directory contains files."
    exit 0
else
    echo "Failure: Directory is empty (or does not exist or is a file)"
    exit 1
fi

4 个答案:

答案 0 :(得分:2)

使用Bash的extglob!(*.gz)grep

$ if grep -qs . path/!(*.gz) ; then echo yes ; else echo nope ; fi

man grep

-q, --quiet, --silent
       Quiet;  do  not  write  anything  to  standard   output.    Exit
       immediately  with  zero status if any match is found, even if an
       error was detected.  Also see the -s or --no-messages option.

-s, --no-messages
       Suppress error messages about nonexistent or unreadable files.

答案 1 :(得分:1)

  

我想检查/ my / dir /是否仅包含* .gz文件,而没有其他内容。

使用find代替小球。使用find并解析查找输出确实更容易。对于简单的脚本而言,通配符很简单,但是一旦您要解析“目录中的所有文件”并进行一些过滤等操作,使用find就会更容易(更安全):

find "$1" -mindepth 1 -maxdepth 1 \! -name '*.gz' -o \! -type f | wc -l | xargs test 0 -eq

这会找到目录中未命名为*.gz或不是文件的所有“事物”(因此占mkdir a.gz的数量),对它们进行计数,然后测试它们是否相等设置为0。如果计数等于0,则xargs test 0 -eq将返回0,否则返回1 - 125之间的状态。您可以根据需要使用简单的|| return 1处理非零返回状态。

您可以通过简单的bash替换来删除xargs,并使用this thread中的方法稍作加速,并获得test的返回值,即0或{{ 1}}:

1

请记住,脚本的退出状态是最后执行的命令的退出状态。因此,如果您愿意的话,您不需要脚本中的其他任何东西,只需一个shebang和这个oneliner就足够了。

答案 2 :(得分:1)

由于您正在使用bash,因此可以使用另一种设置:GLOBIGNORE

#!/bin/bash

containsonly(){
    dir="$1"
    glob="$2"

    if [ ! -d "$dir" ]; then
        echo 1>&2 "Failure: directory does not exist"
        return 2
    fi

    local res=$(
        cd "$dir"
        GLOBIGNORE=$glob"
        shopt -s nullglob dotglob
        echo *
    )
    if [ ${#res} = 0 ]; then
        echo 1>&2 "Success: directory contains no extra files"
        return 0
    else
        echo 1>&2 "Failure: directory contains extra files"
        return 1
    fi
}

# ...

containsonly myfolder '*.gz'

答案 3 :(得分:1)

有些人建议对不符合通配符模式*.gz的所有文件进行计数。根据文件数,这可能效率很低。对于您的工作,仅查找一个与您的通配模式不匹配的文件就足够了。使用-quite的{​​{1}}操作在第一场比赛后退出:

find