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

我正在使用 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"

https://stackoverflow.com/questions/2428628/

相关文章:

linux - 如何将文件从远程服务器复制到本地计算机?

linux - 使用包管理器时如何管理 Perl 模块?

linux - 用户脚本位置 linux (debian etch)

windows - 帮助我让我的 windows cmd.exe 控制台更像一个 Linux 终端

linux - 安装 gitLab 缺少现代化工具?

linux - 如何使用 AWK 合并两个文件?

ruby - Gemfile.lock 写入错误,权限?

c++ - pthread互斥体的开销?

linux - 禁用内存地址的随机化

linux - 如何将文件夹中的文件列表发送到Linux中的txt文件