我正在尝试编写一个脚本,告诉您给定目录中有多少文件和多少目录。
这是我编写过的脚本,但输出始终是"文件数是。"和"目录数量为。"
这是我的代码:
#!/bin/sh
if [ -d "$@" ]
then
find "$@" -type f | ls -l "$@" | wc -l | echo "Number of files is $@"
find "$@" -type d | ls -l "$@" | wc -l | echo "Number of directories is $@"
fi
答案 0 :(得分:3)
您似乎很难理解管道是如何工作的。你原则上不能"使用"结果" (stdout)管道(左侧)作为管道右侧的变量,您需要使用并将其读入变量,例如
printf "line1\nline2\n" | while read line; do_stuff_with "${line}"; done
或者您需要使用命令替换(并且可选地将其分配给变量),例如
files=$(find "$1" -maxdepth 1 -type f -printf . | wc -c)
进一步说明:
$@
扩展到所有位置参数,如果多个参数,[ -d "$@" ]
将失败。ls
完全是多余的find
以递归方式工作,但我想您只想检查第一个目录级别,因此需要maxdepth
参数find
为每个找到的目录/文件打印一个字符,然后计算字节而不是行如果你真的不希望这是递归的,那么使用 globbing 来获得所需的结果可能会更容易:
$ cat t.sh
#!/bin/bash
for file in "${1-.}"/*; do
[ -d "${file}" ] && ((directories++))
[ -f "${file}" ] && ((files++))
done
echo "Number of files: ${files-0}"
echo "Number of directories: ${directories-0}"
$ ./t.sh
Number of files: 6
Number of directories: 1
$ ./t.sh /tmp
Number of files: 9
Number of directories: 3
您可能需要检查man test
以调整链接以获得所需结果。
答案 1 :(得分:2)
你似乎对这里的管道感到困惑。
您希望在find ... | wc -l
命令中扩展echo
的输出。
因此,根据您想要完成的内容,您的脚本应该如下所示:
#!/bin/sh
if [ -d "$@" ]; then
echo "Number of files is $(find "$@" -type f | wc -l)"
echo "Number of directories is $(find "$@" -type d | wc -l)"
else
echo "[ERROR] Please provide a directory."
exit 1
fi