我正在使用 find 来完成一项任务,我注意到当我执行以下操作时:
find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
它只会为每场比赛给你点。当您在该命令中将 dirname
替换为 basename
时,您将获得完整的路径名。我在这里搞砸了什么还是这是预期的行为?我习惯于 basename
给你文件的名称(在本例中为 file.ext
)和 dirname
给你剩下的路径。
最佳答案
考虑以下脚本:
#!/bin/sh
set -x
find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
set -x
显示了扩展的工作原理以及最终命令是什么。运行时,它会给出以下输出:
++ pwd
++ dirname '{}'
+ find /home/kibab -name file.ext -exec echo . ';'
所以,首先展开的是pwd
。其次是 $(dirname {})
。然后将这两个命令的结果放入 find 命令中。因此,您将 find 告诉 -exec echo .
,因此您会看到预期的输出。
当您将 basename
替换为 dirname
时,扩展仍然发生,但扩展的结果不同:
pwd
扩展为当前路径。在我上面的例子中,结果是/home/kibab
basename {}
被执行。此命令的结果是{}
。find 命令在上述替换的情况下执行。最终执行的命令如下所示:
find/home/kibab -name '*.png' -exec echo '{}' ';'
检查上述命令后,您会注意到该命令现在只是简单地回显找到的任何文件。
也许你想要这样的东西?
find `pwd` -name "file.ext" -printf "%f\n"
关于linux - 为什么在 find 命令中使用 dirname 会为每个匹配项提供点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428628/