linux - 为什么在 find 命令中使用 dirname 会为每个匹配项提供点?

标签 linux bash unix find

我正在使用 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 时,扩展仍然发生,但扩展的结果不同:

  1. pwd 扩展为当前路径。在我上面的例子中,结果是 /home/kibab

  2. basename {} 被执行。此命令的结果是 {}

  3. 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/

相关文章:

c - 使用 dlsym 并将 -ldl 添加到标志

ruby - 在用户登录注销时启动和停止守护进程

java - 如何在 linux 中将日志输出保存在文件中

bash - Sox 批量转换

bash - 如何匹配行尾/文本的模式

unix - Unix 中的 execl 行为

c++ - Boost undefined references交叉编译linux到windows

java - 运行 jar 时出现 ClassNotFoundException

linux - 同时执行多个 bash 语句,包括 airodump-ng

c - 检查网站是否在 Perl 或 C 中的最快方法是什么?