shell 为什么find返回一个带有-type f的目录?

fxnxkyjh  于 2023-05-01  发布在  Shell
关注(0)|答案(2)|浏览(106)

我正在做一些粗略的代码分析,我注意到我的输出中有一些奇怪的错误行:

cat: rust/library/portable-simd/crates/test_helpers: Is a directory
cat: rust/library/core/tests/iter/adapters: Is a directory
cat: rust/library/core/src/iter/adapters: Is a directory
cat: rust/library/test/src/formatters: Is a directory
cat: rust/library/test/src/helpers: Is a directory

普通文件是使用-type f选择的,而-print0正是用来避免这种错误的。长话短说,事情是这样的:

$ find rust/library/core/src/iter/adapters -print0 -type f | hexdump -C | head -n3
00000000  72 75 73 74 2f 6c 69 62  72 61 72 79 2f 63 6f 72  |rust/library/cor|
00000010  65 2f 73 72 63 2f 69 74  65 72 2f 61 64 61 70 74  |e/src/iter/adapt|
00000020  65 72 73 00 72 75 73 74  2f 6c 69 62 72 61 72 79  |ers.rust/library|

注意第一个条目-这是一个目录!

$ la -d rust/library/core/src/iter/adapters/
drwxr-xr-x 2 user group 4096 Apr 11 01:57 rust/library/core/src/iter/adapters/

更奇怪的是,当省略-print0时,这条线并不存在。.

$ find rust/library/core/src/iter/adapters -type f | hexdump -C | head -n3
00000000  72 75 73 74 2f 6c 69 62  72 61 72 79 2f 63 6f 72  |rust/library/cor|
00000010  65 2f 73 72 63 2f 69 74  65 72 2f 61 64 61 70 74  |e/src/iter/adapt|
00000020  65 72 73 2f 6d 61 70 2e  72 73 0a 72 75 73 74 2f  |ers/map.rs.rust/|

那是窃听器吗看上去像是-但已经找到了。这就像。嗯。嗯。.经过良好测试的等等。肯定是我用错了
我的find二进制文件来自Arch Linux中的GNU findutils包。
编辑:这绝对不是一个bug:

$ podman run --rm -i -v ".:/data" --workdir /data docker.io/cicirello/gnu-on-alpine:latest find rust/library/core/src/iter/adapters -type f -print0 | hexdump -C | head -n3
00000000  72 75 73 74 2f 6c 69 62  72 61 72 79 2f 63 6f 72  |rust/library/cor|
00000010  65 2f 73 72 63 2f 69 74  65 72 2f 61 64 61 70 74  |e/src/iter/adapt|
00000020  65 72 73 2f 6d 61 70 2e  72 73 00 72 75 73 74 2f  |ers/map.rs.rust/|

一切正常不管是在集装箱里还是在集装箱外,都是4号。9.0.

vngu2lb8

vngu2lb81#

您需要交换-print0-type f,因为-print0会导致打印该行。

sf6xfgos

sf6xfgos2#

好吧......通常情况下,这是一个非常小的事情,决定了这五个目录是否是输出的一部分:
参数的顺序。-print0属于-type f之后-这是一个总是返回true的操作!我只看到这些目录的原因是后来出现的(rs|go)$grep(如果我在正则表达式中包含\.,参数顺序的这个问题可能会被忽视)。
提醒我actions是可以影响结果的表达式的事情是来自man页面的不祥的True;

-print0
              True; print the full file name on the standard output,

实际上,busyboxfind在交换参数时的行为是相同的。
光荣!

相关问题