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
时,您会发现其中有大量有用的标志。
当 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
时,您会发现其中有大量有用的标志。