当使用带有$(dirname {})的find时,它总是只输出“。作为目录名。例如:
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
.有趣的是,为每个find创建一个新的shell会生成正确的输出:
find . -name \*.h -exec sh -c 'echo $0; echo $(dirname $0);' {} \;发布于 2019-11-18 18:13:51
这一行给出了你想要的:
find . -name *.h -print -exec dirname {} \;发布于 2019-11-18 19:36:30
通过脚本测试上述命令后,观察到$(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样式或Kent's solution。
对您的命令稍作修改也可以,例如,将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发布于 2019-11-18 19:42:55
您可能真的想要使用以下代码:
find . -name '*.h' -type f -printf "%p\n%h\n"当您查看printf format部分下的man find时,您会注意到有很多有用的标志。
https://stackoverflow.com/questions/58911805
复制相似问题