我试图编写一个脚本来检查目录是否仅包含 特定类型的文件(和/或文件夹),将为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
答案 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