简单的问题,但我不知道在哪里看,谷歌不响应句号和斜杠。
我只是想计算当前目录中的文件和目录的数量(不包括子文件夹/文件),并试图区分它们ls -1 | wc -l
,ls | wc -l
因为它们看起来相同。我正在看的一个网站说“请记住,这也计算了 ./ 和 ../ 目录。”关于ls -1
,我不确定这是否意味着它包含之前的目录或其他内容(我不想要的),但从测试来看它似乎并没有做到这一点。
有人可以确认其中哪一个最适合仅计算当前目录(而不是子目录)中的文件和目录数量以及 ./ 和 ../ 目录的含义吗?
答案1
Unix 系统上的每个目录(可能还有每个其他系统)都至少包含两个目录条目。它们是.
(当前目录)和..
(父目录)。对于根目录,它们指向相同的位置,但对于任何其他目录,它们都不同。您可以使用stat
,pwd
和命令亲自查看这一点cd
(在 Linux 上):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
请注意,bin
每个sbin
都有两个链接。一个是根目录中的目录条目,另一个是.
该目录内的条目。
使用ls
管道 towc -l
是一个简单的技巧,可以计算 ls 输出中的行数。假设每个文件或目录将在输出中恰好占据一行。当输出是非终端时,GNU ls 会自动执行此操作;其他人可能需要-1
显式打开该行为的选项。只需计算并输出其输入中的wc -l
行数 ( )。-l
这种方法的问题在于,在 Linux 和 Linux 上传统上使用的文件系统上,文件名和目录名(在这方面它们实际上是一个且相同的)是允许包含换行符。在存在这些的情况下,任何一种方法都会崩溃——这些条目将被计为两个或多个条目,而实际上它们是一个。
只要您使用 GNU ls,没有名称包含换行符的目录条目,并且没有奇怪的别名ls
(例如ls -a
),两者都会输出当前(或指定)目录中的文件和目录的计数。对于大多数人来说,这已经足够了,但在现实中却无效。一般的案件。
如果您需要正确处理目录项名称中的异常字符(主要是换行符),我建议使用 ls 的-b
选项来转义它们。ls -1bA
将在其自己的行上打印每个目录条目名称,转义不寻常的字符(因此每个目录条目将被视为一个),包括任何点文件和目录。添加wc -l
一个完整的命令行,ls -1bA | wc -l
其中将报告当前目录中的文件和目录的数量(但忽略.
和;这是和..
之间的区别),但不会下降到任何子目录。如果您不希望任何点文件计入总数,只需省略 的参数即可。-a
-A
-A
ls
答案2
回答主题中的问题:
当在 Unix 中创建目录 B 时,它会作为新条目添加到另一个目录 A(其父目录)中,并且在 B 中会添加两个条目:一个称为.
自身的硬链接,另一个称为..
自身的硬链接链接到 A。
这些是唯一允许的目录硬链接(尽管某些 Unices 的某些旧版本也允许任意链接)。
这就是为什么对于大多数文件系统(btrfs
这是一个值得注意的例外),目录的编号links
指示它有多少个子目录(占其条目..
)。
当您重命名/移动目录时,如果它位于同一目录(使用不同的名称),则仅A
更改名称条目。 B 的.
并且..
不受影响。但如果你将它移动到不同的目录,那么..
inB
就会改变。这解释了为什么您可以重命名一个没有写访问权限的目录(假设您对父目录有写访问权限),只要您不将其移动到另一个目录(否则需要更改条目..
会阻止你不要移动它)。
但请注意: 可能与因为/a/b/../c
不同/a/c
/a/b
可能是象征性的链接到其他目录。
一个例外是当该路径被赋予cd
某些 shell 的命令时。那些cd
待遇..
逻辑上忽略..
目录中的条目。一个你经常看到的原因cd -P
您经常在正确编写的脚本中看到禁用该功能特征否则可能会导致混乱和不一致。
.
要计算当前目录中不包括和..
的条目数bash
,您可以执行以下操作:
shopt -s nullglob dotglob
shopt -u failglob
set -- *
echo "$#"
使用 zsh:
f=(*(ND))
echo $#f
或者一次性使用匿名函数,并禁用排序作为优化:
(){echo $#} *(NDoN)
便携:
find . ! -name . -prune -print | grep -c /
答案3
我不是一个伟大的 Linux 专家,但我了解 Linux(16 年前曾是 Slackware 上的管理员:) 美好的旧时光
./ 和 ../ 目录很简单:是当前目录,.. 是上一个目录(在 pwd -local 目录命令树中-
如果计算它们,我认为它们会在列表总数中添加 2,而不是真正递归地计算当前目录下面的目录,并再次计算当前目录 (.):))
所以基本上我认为它将值 2 添加到当前目录中已经计数(文件)的值。
如果我错了,任何人都可以纠正我。
我只是发帖来帮忙,发现这里没有人回答这个问题,他们可能很忙。但只要试验一下,看看是否有 10 个文件并计数为 12,那就够了。