Bash-dirname无法使用替换



当使用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时,您会注意到有大量有用的标志。

相关内容

  • 没有找到相关文章

最新更新