显示目录中文件和目录数量的 Shell 脚本

use*_*348 2 unix bash shell find

我正在尝试编写一个脚本来告诉您给定目录中有多少个文件和多少个目录。

这是我编写的脚本,但输出始终是“文件数是”。和“目录数是。”

这是我的代码:

#!/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
Run Code Online (Sandbox Code Playgroud)

Adr*_*rth 5

您似乎很难理解管道的工作原理。您不能“本地”使用管道(左侧)的“结果”(标准输出)作为管道右侧的变量,您要么需要使用它并将其读入变量,例如

printf "line1\nline2\n" | while read line; do_stuff_with "${line}"; done
Run Code Online (Sandbox Code Playgroud)

或者您需要使用命令替换(并可选择将其分配给变量),例如

files=$(find "$1" -maxdepth 1 -type f -printf . | wc -c)
Run Code Online (Sandbox Code Playgroud)

进一步说明:

  • $@扩展到所有位置参数,如果有多个参数,您[ -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}"
Run Code Online (Sandbox Code Playgroud)

$ ./t.sh
Number of files: 6
Number of directories: 1

$ ./t.sh /tmp
Number of files: 9
Number of directories: 3
Run Code Online (Sandbox Code Playgroud)

您可能需要检查man test并调整链接以获得所需的结果。