对于一个大学项目,我必须统计文件夹中的所有文件。我使用了以下命令:
find ./dirName | wc -l
但是当我将其与 Nautilus 提供的文件数进行比较时,它的数量要多得多。请参见下面的屏幕截图:
./dirName 实际上是来自存储库(SVN/GIT)的文件目录,我需要找出系统组成了多少个文件。
有人能解释为什么会出现这些差异并告诉我哪一个更可靠吗?
答案1
Nautilus 不计算隐藏文件。
以点 ( .
) 开头的文件和目录在 Linux 中是隐藏的。
重现步骤:
mkdir somedir && cd somedir
touch .hidden .hidden2 regular regular2 # 4 files, 2 hidden
find . | wc -l # outputs 5 (4 files + dir itself)
Nautilus 报告称:内容:2 条,共 0 字节
使用 Git
这里快速演示了目录中 Git 中使用的元数据文件的数量.git
。
git init myrepo # Initialized [...] in myrepo/.git/
cd myrepo/
find . | wc -l # outputs 23! for an empty repository
tree -a # outputs 10 directories, 12 files
echo "have to add something for git ls-tree" > somefile
git add somefile && git commit -m "Initial commit"
find . | wc -l # outputs 38 (!)
git ls-tree -r HEAD | wc -l # outputs 1
Nautilus 也在那里报告了 1。
我的建议:使用tree
正如 Gilles 指出的那样他的回答,如果文件名包含特殊字符,则使用find
和通过管道传输它并不是太可靠。wc
看来tree
能够正确地做到这一点:
tree -a
.
├── dir
│ └── regular3
├── dir2
├── .hidden
├── .hidden2
├── regular
└── regular2
2 directories, 5 files
答案2
文件名中可能包含换行符。非常不建议这样做,但技术上可行。这可能就是您的练习的内容。
可靠地计算目录下文件数量的一种方法是打印find
一些可以可靠计算的内容,即每个文件一个项目。
查找./dirName -printf a | wc -c
请记住,它find
包括dirName
其自身,并递归到子目录。
如果你只想要里面的文件dirName
,而不进行递归,让 shell 对它们进行计数:
GLOBIGNORE=.:..
set -- *
echo $#
答案3
尝试检查输出find
:
find somewhere | less
您将看到,find
默认情况下,Nautilus 会输出任何类型的文件,而不会根据类型或名称进行区分。相反,Nautilus 不会计算起始目录(somewhere
在示例中)或浏览时不会显示的文件。
要解决该问题,请使用-type
查找选项:
find somewhere -type f | wc -l
find somewhere ! -type d | wc -l
第一行将查找所有常规文件。第二行查找所有非目录项(即常规文件、块设备、UNIX 套接字等)。man find
有关更多信息,请参阅。
您可能有兴趣阅读-H
,-L
和-P
,它们控制如何find
处理符号链接(以及符号链接如何影响计数)。