Bash'。' vs正确的dir字符串

时间:2013-01-29 11:58:08

标签: bash

我一直在运行一些find命令,并注意到bash如何处理. vs一个字符串输入的dir似乎很奇怪。

find . -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

完全不同
find [current dir] -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

是什么给出的?

bash对待'。'和字符串指定的目录路径不同。不是'。'替代现在的目录?

4 个答案:

答案 0 :(得分:8)

find所做的是将路径的其余部分附加到作为参数传递的位置。

即:如果你在dir“/ home / user / find”:

find .

打印:

.
./a
./b

但如果你尝试:

find /home/user/find

打印:

/home/user/find
/home/user/find/a
/home/user/find/b

所以find将路径的其余部分(/ a,/ b ...)附加到参数(。或/ home / user / find)。

答案 1 :(得分:2)

您可以使用pwd命令代替.,它的行为也相同。

find "`pwd`"  -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;

答案 2 :(得分:2)

@arutaku确定了问题的根源;让我指出另一种可能的解决方案。如果您的find版本支持它,那么-execdir primary会非常简单地执行您想要的操作:它将cd到每个文件所在的目录中,然后仅使用文件名执行命令(无路径):< / p>
find . -type f -execdir aunpack {} \;

答案 3 :(得分:1)

Bash与它无关,这是find的逻辑。它不会尝试扩展或规范化提供的路径,它只是逐字地使用它们:不仅用于.,而且用于任何路径规范(例如../../my/other/project

我认为这是合理的,因为任何转换都比当前行为更复杂。至少我们必须记住在转换过程中是否解析了符号链接。每当我们出于某种原因想要相对路径时,我们就必须再次对它进行相对化。