我已经增强了代码问题我之前发过帖子:
我的代码是:
DIR="$1"
if [ -e "$DIR" ]
then
echo -n "total directories:" ; find $DIR -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
if [ -f "$DIR" ]
then
echo " Directory doesn't exist"
else
echo " please pass correct arguments"
fi
fi
./countfiledirs
当我执行or时,此代码给出输出countfiledirs jhfsakl
:
sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs
please pass correct arguments
sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs ffff
please pass correct arguments
当我执行脚本名称./countfiledirs
时,我想要输出:
please pass correct arguments
对于./countfiledirs ffff
如下:
directory doesn't exists
当我执行 script 时,代码还有另一个问题./countfiledirs /usr/share
。它没有给出我给出的路径的实际目录和子目录数量。显示 4 个目录,而不是 3 个目录
答案1
如果存在则测试[ -f "$DIR" ]
为真$DIR
是一个文件。那根本不是你想要的。正如我在上一个问题中所建议的,您应该用来$#
检查参数是否已通过。然后您可以使用-e
来检查该参数是否存在。
下一期还将find
列出.
当前目录。您可以使用-mindepth 1
GNU 来避免这种情况find
:
DIR="$1"
if [ $# -lt 1 ]
then
echo "Please pass at least one argument" && exit
fi
if [ -e "$DIR" ]
then
echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
echo "Directory doesn't exist"
fi
您还可以将上述内容压缩为(尽管此版本不区分不存在的目录和文件而不是目录):
dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
$(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
printf "%s\n" "There is no directory named '$dir'."
答案2
正如您在最后一个条件中所看到的那样,您正在检查 $DIR 是否引用“常规文件”。也就是说,不是目录。所以它总是失败(因为你总是给出目录,大概)并打印“请传递正确的参数”。
至于目录计数“不正确”,事实并非如此。如果您像在脚本中一样手动运行 find 命令,您会看到它返回其搜索根目录及其子目录。因此,您可以知道它正在对给定目录进行计数,或者通过在调用 find 后简单地递减计数来获得您想要的答案。
这似乎就是您正在寻找的。请耐心听我说;我已经证实这有效,但我不是 BASH 专家。
DIR="$1"
if [ ! -d "$DIR" ] #If not a directory,
then
echo " please pass correct arguments"
exit 1
fi
# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l