为什么我看到 Nautilus 和 find 之间的文件数量有差异?

为什么我看到 Nautilus 和 find 之间的文件数量有差异?

对于一个大学项目,我必须统计文件夹中的所有文件。我使用了以下命令:

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处理符号链接(以及符号链接如何影响计数)。

相关内容