shell 脚本中特定目录中的文件和目录数量

shell 脚本中特定目录中的文件和目录数量

我正在使用 Linux,它对我来说是新的。我创建了一个 shell 脚本countfiledirs。我想知道特定目录中的文件和目录的数量。

我的代码是:

#!/bin/bash
echo "total directories:" `find . -type d | wc -l`

echo "total files:" `find . -type f | wc -l`

当我执行这个命令时显示如下./countfiledirs

total directories: 148
total files: 255 

我想知道如果我使用这个命令有多少个目录和文件./countfiledirs /usr/share

答案1

文件和目录的名称中可以包含换行符,因此您不能“仅仅”wc -l像您正在做的那样使用。

如果您想要一个接受参数并递归计算文件和目录数量的脚本,您应该使用:

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \\n | wc -l
echo -n 'total files:';  find "$1" -type f -printf \\n | wc -l

并通过提供目录作为命令行参数来调用脚本:

./your_script_name /home/e_g_your_home_dir.

虽然,简而言之,上面的内容是目录的一个(除非您认为目录本身是“目录”),但您也可以替换wc -l为可以处理 NUL 终止“行”的内容并使用-print0

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-2"
echo -n 'total files:';  find "$1" -type f -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-1"

如果您不想递归地执行此操作(仅计算您指定的目录中的文件/目录,而不计算您指定的目录中的文件/目录),您应该在参数-maxdepth 1后面添加$1

答案2

您需要接受命令行中的第一个参数$1。理想情况下,您可以将其分配给变量DIR="$1".如果没有提供任何内容,那么您似乎希望默认为当前目录.。您可以使用test -z "$DIR" && DIR='.'or 来完成此操作,更惯用的方法是使用变量并提供默认值"${DIR:-.}"

把它们放在一起你可能会得到这样的东西:

#!/bin/bash
DIR="$1"

echo "total directories: $(find "${DIR:-.}" -type d -ls | wc -l)"
echo "total files: $(find "${DIR:-.}" -type f -ls | wc -l)"

顺便说一句,您发布的原始代码(在我编辑您的问题之前)无法工作:

echo "total directories:" find . -type d | wc -l

您需要将 放入find . -type d | wc -l反引号中`...`,或者更好的是,放入构造中$( ... )。我在这里使用了第二种方法。对于简单的情况,它们可以是等效的,但$( ... )通常更强大。

相关内容