Bash - 目录名不适用于替换

Bash - dirname not working with substitution

find$(dirname {}) 一起使用时,它总是只输出“.”。作为目录名。例如。对于:

find . -name \*.h -exec echo {} \; -exec echo $(dirname {}) \;

输出:

./folder/folder.h
.
./folder/sub_folder/sub_folder.h
.
./test.h
.

但我希望这样:

./folder/folder.h
./folder
./folder/sub_folder/sub_folder.h
./folder/sub_folder
./test.h
.

有趣的是,为每个查找创建一个新的 shell 会生成正确的输出:

find . -name \*.h -exec sh -c 'echo [=14=]; echo $(dirname [=14=]);' {} \;

这一行给了你想要的:

find . -name *.h -print -exec dirname {} \;

通过脚本测试上述命令后,观察到 $(dirname {}) 被扩展到当前目录 .'。

mkdir -p test1/test2
touch test1/test2/tests.h
find . -name \*.h -exec echo {} \; -exec echo $(dirname {}) \;
./test1/test2/tests.h
.

echo "find . -name \*.h -exec echo {} \; -exec echo $(dirname {}) \;" > checkh.sh

bash -vx checkh.sh

find . -name \*.h -exec echo {} \; -exec echo . \;
+ find . -name '*.h' -exec echo '{}' ';' -exec echo . ';'
./test1/test2/tests.h
.
.

这就是输出始终仅显示为 . 当前目录的原因。

因此,使用您的迷你脚本 sh -c 样式或

对您的命令稍作修改也可以,即将 echo 放入命令替换中:

find . -name \*.h -exec echo {} \; -exec $(echo dirname {}) \;
./test1/test2/tests.h
./test1/test2

修改后的测试用例如下:

echo "find . -name \*.h -exec echo {} \; -exec $(echo dirname {}) \;" > checkh2.sh 
bash -vx checkh2.sh 
find . -name \*.h -exec echo {} \; -exec dirname {} \;
+ find . -name '*.h' -exec echo '{}' ';' -exec dirname '{}' ';'
./test1/test2/tests.h
./test1/test2

你可能真的想用这个:

find . -name '*.h' -type f -printf "%p\n%h\n"

当您查看 printf 格式部分下的 man find 时,您会发现其中有大量有用的标志。