如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
如何递归地计数Linux目录中的文件?
我发现了这个:
find DIR_NAME -type f ¦ wc -l
但是当我运行它时,它返回以下错误。
查找:路径必须在表达式之前:
当前回答
假设你想要一个每个目录的文件总数,试试:
for d in `find YOUR_SUBDIR_HERE -type d`; do
printf "$d - files > "
find $d -type f | wc -l
done
对于当前目录,尝试这样做:
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done;
如果你有很长的空格名,你需要改变IFS,像这样:
OIFS=$IFS; IFS=$'\n'
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done
IFS=$OIFS
其他回答
要确定当前目录中有多少文件,输入ls -1 | wc -l。这使用wc对ls -1输出中的行数(-l)进行计数。它不计算dotfiles。请注意,我在以前版本的HOWTO中使用的ls -l(这是一个“L”而不是前面例子中的“1”)实际上会给你一个比实际计数大1的文件计数。这一点要感谢内贾德。
如果你想只计算文件而不包括符号链接(这只是一个你可以做的其他事情的例子),你可以使用ls -l | grep -v ^l | wc -l(这是一个“l”而不是“1”,我们想要一个“长”列表)。Grep检查以“l”开头的任何行(表示链接),并丢弃该行(-v)。
相对速度:“ls -1 /usr/bin/ | wc -l”在未加载的486SX25上大约需要1.03秒(在此机器上/usr/bin/有355个文件)。“ls -l /usr/bin/ | grep -v ^l | wc -l”大约耗时1.19秒。
来源:http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html
如果你想避免错误的情况,不要让wc -l看到有换行符的文件(它将被算作2+文件)
例:考虑这样一种情况,我们有一个文件,其中只有一个EOL字符
> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2
因为至少gnu wc似乎没有一个选项来读取/计数一个以空结束的列表(除了从文件中),最简单的解决方案就是不传递文件名,而是每次找到文件时输出一个静态输出,例如在上面的同一个目录中
> find -type f -exec printf '\n' \; | wc -l
1
或者你的发现是否支持
> find -type f -printf '\n' | wc -l
1
假设你想要一个每个目录的文件总数,试试:
for d in `find YOUR_SUBDIR_HERE -type d`; do
printf "$d - files > "
find $d -type f | wc -l
done
对于当前目录,尝试这样做:
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done;
如果你有很长的空格名,你需要改变IFS,像这样:
OIFS=$IFS; IFS=$'\n'
for d in `find . -type d`; do printf "$d - files > "; find $d -type f | wc -l; done
IFS=$OIFS
这种过滤格式的替代方法计算所有可用的grub内核模块:
ls -l /boot/grub/*.mod | wc -l
你可以使用
$ tree
安装后的树包用
$ sudo apt-get install tree
(在Debian / Mint / Ubuntu Linux机器上)。
该命令不仅显示文件的计数,还分别显示目录的计数。选项-L可用于指定最大显示级别(默认情况下,它是目录树的最大深度)。
通过提供-a选项,也可以包含隐藏文件。