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
默认操作 ,-print将完整路径名输出到标准输出。
find输出从命令行上给出的路径开始找到的文件的路径。
find .\nRun Code Online (Sandbox Code Playgroud)\n要求find查找及其子目录下的文件,并显示以;.开头的结果。./
find foo\nRun Code Online (Sandbox Code Playgroud)\n会做同样的事情,但从 开始foo,并且会产生从 开始的结果foo/。
我不认为\xe2\x80\x99tfind这样做是为了防止无前缀文件名的问题;相反,它这样做是为了保持一致性 \xe2\x80\x94 无论作为参数提供的路径如何,输出-print始终以该路径开头。
通过 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
更一般地说,作为./前缀可以帮助防止错误,例如,如果您的文件名称以破折号开头;例如,如果您有一个名为 的文件-f,rm -f则不会删除它,但rm ./-f会删除它。
当使用 shell 或exec*p()标准 C 函数(以及其他语言中的等效函数)运行命令时,当命令名称不包含 时/,将查找命令的路径,$PATH而不是解释为相对路径(中的文件)当前工作目录)。.这同样适用于多个 shell 的/特殊内置函数的参数source(包括 POSIX 兼容的sh实现)。在这种情况下使用./cmd而不是cmd,这是指定相同相对路径的另一种方法,但使用/是通常调用存储在当前工作目录中的命令的方式。
Rom*_*nov 11
当我们谈论普通文件时,没有实际用途。但当我们谈论可执行文件时,它就有意义了。当您执行时(并且file1位于当前目录中):
file1
Run Code Online (Sandbox Code Playgroud)
shell 在 PATH 变量中的所有路径中搜索可执行文件。仅当 PATH 中有类似以下内容时才会执行此文件:(:.:当前目录在 PATH 搜索中)。您可以通过以下方式运行file1位于当前目录中的 ,而不是这种非常不明智的设置:
./file1
Run Code Online (Sandbox Code Playgroud)
Linux 中的许多命令-作为表示 stdin 的特殊文件接收,因此要指示名称确实为 的文件,-您必须使用./-. 看
此外-也用于参数,因此如果您想使用以-like开头的文件名--file,则必须使用./--file. 这也是为什么如果你想 grep 一个以 开头的模式,-你必须使用grep -e --pattern. 请参阅如何“减少”名为“-”的文件?