Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash &引用;找到-d类“wc-l”;显示比实际计数多1个目录_Bash - Fatal编程技术网

Bash &引用;找到-d类“wc-l”;显示比实际计数多1个目录

Bash &引用;找到-d类“wc-l”;显示比实际计数多1个目录,bash,Bash,有人能告诉我为什么命令 find . -type d | wc -l ls -lR | grep ^d | wc -l 比实际目录数多显示一个目录?该命令应该从我所在的目录打印目录和子目录的数量。命令 find . -type d | wc -l ls -lR | grep ^d | wc -l 做同样的事情,但在这种情况下,我得到了正确的数字。当我改用f或-(file)时,情况也是如此。它只需再添加一个目录/文件。它还计算当前目录。如果要消除这一点,可以将mindepth变量设置为1

有人能告诉我为什么命令

find . -type d | wc -l
ls -lR | grep ^d | wc -l
比实际目录数多显示一个目录?该命令应该从我所在的目录打印目录和子目录的数量。命令

find . -type d | wc -l
ls -lR | grep ^d | wc -l

做同样的事情,但在这种情况下,我得到了正确的数字。当我改用
f
或-(file)时,情况也是如此。它只需再添加一个目录/文件。

它还计算当前目录。如果要消除这一点,可以将mindepth变量设置为1

$ find . -mindepth 1 -type d | wc -l

将只给出子目录的计数…

有两个可能的错误源:

  • 当前目录本身
  • 名称中带有文字换行符的目录

GNU查找(使用
-printf
) 要消除这两种情况,在使用GNU find时:

find . -mindepth 1 -type d -printf '\n' | wc -l
  • 放置
    -mindepth 1
    可防止命名参数(
    )匹配
  • 使用
    -printf'\n'
    而不是默认的
    -print
    操作可确保名称本身不会更改文件的计数方式

GNU或BSD查找(使用
-print0
) 使用现代BSD
find
(与在MacOS上一样),您可能没有
-printf
,但仍然会有
-print0
。因此,对于与两种主要实现兼容的代码:

find . -mindepth 1 -type d -print0 | tr -cd '\0' | wc -c
tr-cd'\0'
删除除NULs以外的所有字符
wc-c
计算流中剩余的字符数——从而计算剩余的NUL分隔符,从而计算文件数。(NUL是唯一可以安全使用的字符,因为它不允许存在于路径中)


POSIX查找(使用
-exec
) 如果您没有
-printf
-print0
,您仍然可以将打印安全内容(如参数数量)的任务委托给shell:

find . -mindepth 1 -type d -exec sh -c 'echo "$#"' _ {} + | paste -sd+ - | bc

不要打印名字,而是打印一个点。如果你不像我们大多数人一样,不使用换行符收集DIR,那么将管道连接到wc-l当然是一个简单的解决方案——你只需要知道什么时候不使用它

concat=$(find . -mindepth 1 -type d -printf ".")
echo ${#concat}
66

find
还可以查找当前目录
。您可能还有以
开头的其他目录,例如
.config

要递归计数所有目录,包括以
开头的目录,请执行以下操作:

find * .* -type d | wc -l
find * -type d | wc -l
要递归计数所有目录,但排除以
开头的目录,请执行以下操作:

find * .* -type d | wc -l
find * -type d | wc -l

mkdirfoo;cd-foo;mkdir 1 2 3;找到-键入d
,因为
find
也会查找
。有没有办法排除这一点?另外,
mkdir$'foo\nbar\nbaz'
将创建一个目录,如果按字面打印名称,则该目录计数为3(一些
find
实现将转义,一些不会)。依赖默认的
-print
操作是不好的形式。堆栈溢出是一个用于编程和开发问题的站点。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。一个人不需要故意收集东西,让它们到处都是。我相信你们已经听过我的战争故事了,一个随机缓冲区o垃圾被转储到文件名中,导致了一个重大的数据丢失事件。(不是批评答案,只是回应评论)。当我处于pentester模式时,我可能会故意创建这样的案例。在99%以上的案例中,当我使用find时,我大致知道会发生什么。我有一个目录,其中包含有毒的文件名,这是我自己为试验这种情况而制作的。在/etc、/lib、/usr和/var中,我发现安全方法和惰性方法之间没有区别,因此似乎有一个很好的理由避免dir/filename中出现换行符,这会导致它们非常罕见。我想,这是因为它们对懒惰的程序员和管理员来说是违反人体工程学的。但是,文件名中的空白正在慢慢流行起来——最常见的是作为公司产品名的文件名。如果您的文件名或目录名中有换行符,可能您从事的职业不对!:)@你的雇主可能是,你的客户,同事等等。一些工具根据不完整的假设自动生成文件名。从媒体生成的文件名…@karakfa,…如果同事使用的第三方库存在缓冲区溢出(我经常复述的情况就是这样),那么您的职业是错误的?请注意,“pentester”是一种职业;“黑帽子”也是如此,其中一个或两个可能最终都会出现在您的网络中(或让一个人在未加密的系统流量上处于中间位置),试图在他们尚未站稳脚跟的系统中找到可利用的角落案例。