我正在使用 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
反引号中`...`
,或者更好的是,放入构造中$( ... )
。我在这里使用了第二种方法。对于简单的情况,它们可以是等效的,但$( ... )
通常更强大。