相对文件路径前面的“./”的实际用途是什么(在“find”的输出中)?

Mar*_*ter 10 command-line find filenames unix-philosophy

./file为什么有些相对文件路径以, 而不是仅仅以 的形式显示file?例如,当我这样做时:

find .
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

./file1
./file2
./file3
Run Code Online (Sandbox Code Playgroud)

除了让道路更加混乱之外,实际目的是什么?这并不是说它可以阻止我发生一些事故。两者都是相对路径,并且cat ./file1工作方式与 相同cat file1

这种行为是来自find命令,还是某个系统范围的 C 库?

好的,我明白为什么使用./filefor-exec构造是必要的(以确保我有... | xargs rm ./-i, 而不是... | xargs rm -i)。

但是在什么情况下./使用-print语句时缺少会破坏任何东西呢?

我正在尝试构建任何破坏某些内容的语句:

touch -- -b -d -f -i
find -printf '%P\n' | sort

-b
-d
-f
-i
Run Code Online (Sandbox Code Playgroud)

一切正常。

出于好奇,我如何构建一个-print声明来证明这个问题?

Ste*_*itt 37

此行为来自find,并由POSIX 指定

\n
\n

每个路径操作数应在提供时按原样进行评估,包括所有尾随 <slash> 字符;层次结构中遇到的其他文件的所有路径名应由当前路径操作数、<slash>(如果当前路径操作数不以 1 结尾)以及相对于路径操作数的文件名的串联组成。

\n
\n

默认操作 ,-print将完整路径名输出到标准输出。

\n

find输出从命令行上给出的路径开始找到的文件的路径。

\n
find .\n
Run Code Online (Sandbox Code Playgroud)\n

要求find查找及其子目录下的文件,并显示以;.开头的结果。./

\n
find foo\n
Run Code Online (Sandbox Code Playgroud)\n

会做同样的事情,但从 开始foo,并且会产生从 开始的结果foo/

\n

我不认为\xe2\x80\x99tfind这样做是为了防止无前缀文件名的问题;相反,它这样做是为了保持一致性 \xe2\x80\x94 无论作为参数提供的路径如何,输出-print始终以该路径开头。

\n

通过 GNU 实现,您可以使用in 代替find来从打印文件的开头去除初始路径。例如,使用or ,您将得到代替or for 这些文件。-printf \'%P\\n\'-printfind foo/bar -name file -printf \'%P\\n\'find . -name file -printf \'%P\\n\'dir/filefoo/bar/dir/file./dir/file

\n

更一般地说,作为./前缀可以帮助防止错误,例如,如果您的文件名称以破折号开头;例如,如果您有一个名为 的文件-frm -f则不会删除它,但rm ./-f会删除它。

\n

当使用 shell 或exec*p()标准 C 函数(以及其他语言中的等效函数)运行命令时,当命令名称不包含 时/,将查找命令的路径,$PATH而不是解释为相对路径(中的文件)当前工作目录)。.这同样适用于多个 shell 的/特殊内置函数的参数source(包括 POSIX 兼容的sh实现)。在这种情况下使用./cmd而不是cmd,这是指定相同相对路径的另一种方法,但使用/是通常调用存储在当前工作目录中的命令的方式。

\n

  • “相反,这样做是为了一致性”——有人可能会说打印 `foo/` 也不是必要的,但它*是*因为 `find` 可以接受多个起点,我认为这是关键原因。例如,使用“find”时更明显需要包含前缀。富酒吧`。 (14认同)

Rom*_*nov 11

当我们谈论普通文件时,没有实际用途。但当我们谈论可执行文件时,它就有意义了。当您执行时(并且file1位于当前目录中):

file1
Run Code Online (Sandbox Code Playgroud)

shell 在 PATH 变量中的所有路径中搜索可执行文件。仅当 PATH 中有类似以下内容时才会执行此文件:(:.:当前目录在 PATH 搜索中)。您可以通过以下方式运行file1位于当前目录中的 ,而不是这种非常不明智的设置:

./file1
Run Code Online (Sandbox Code Playgroud)

  • @TrevorBoydSmith,它打开一个后门来执行位于当前目录中的命令。这可用于恶意活动(简化它们)。或者可能导致错误的行动(这些行动有时可能会被破坏) (2认同)
  • @TrevorBoydSmith,这是一些大公司强化推荐列表的安全控制之一。 (2认同)

phu*_*clv 5

Linux 中的许多命令-作为表示 stdin 的特殊文件接收,因此要指示名称确实为 的文件,-您必须使用./-. 看

此外-也用于参数,因此如果您想使用以-like开头的文件名--file,则必须使用./--file. 这也是为什么如果你想 grep 一个以 开头的模式,-你必须使用grep -e --pattern. 请参阅如何“减少”名为“-”的文件?