我正在尝试编写一个脚本,该脚本将检查目录是否仅包含特定类型的文件(和/或文件夹),并且将为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
我想检查/ 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
。
您可以xargs
通过简单的bash替换将其删除,并使用该线程中的方法以加快速度并获得test
返回值,即0
or 1
:
[ 0 -eq "$(find "$1" -mindepth 1 -maxdepth 1 \! -name '*.gz' -o \! -type f -print '.' | wc -c)" ]
请记住,脚本的退出状态是最后执行的命令的退出状态。因此,如果您愿意的话,您不需要脚本中的其他任何东西,只需一个shebang和这个oneliner就足够了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句