当使用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 $0; echo $(dirname $0);' {} ;
通过脚本测试上述命令后,可以观察到$(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的解决方案。
对您的命令进行轻微修改也会起作用,即将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 -print -exec dirname {} ;
您可能真的想要使用这个:
find . -name '*.h' -type f -printf "%pn%hn"
当您在printf
格式部分下查看man find
时,您会注意到有大量有用的标志。