我一直在运行一些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对待'。'和字符串指定的目录路径不同。不是'。'替代现在的目录?
答案 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)
find
版本支持它,那么-execdir
primary会非常简单地执行您想要的操作:它将cd到每个文件所在的目录中,然后仅使用文件名执行命令(无路径):< / p>
find . -type f -execdir aunpack {} \;
答案 3 :(得分:1)
Bash与它无关,这是find
的逻辑。它不会尝试扩展或规范化你提供的路径,它只是逐字地使用它们:不仅用于.
,而且用于任何路径规范(例如../../my/other/project
)
我认为这是合理的,因为任何转换都比当前行为更复杂。至少我们必须记住在转换过程中是否解析了符号链接。每当我们出于某种原因想要相对路径时,我们就必须再次对它进行相对化。