2

我一直在运行许多查找命令,并注意到 bash 如何处理.作为字符串输入的 vs 目录似乎有些奇怪。

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

4 回答 4

8

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

即:如果您在目录“/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)。

于 2013-01-29T12:10:52.933 回答
2

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

find "`pwd`"  -type f -exec sh -c 'cd $(dirname "$0") && aunpack "$0"' {} \;
于 2013-01-29T12:04:21.790 回答
2

@arutaku has pinpointed the source of the problem; let me point out another possible solution. If your version of find supports it, the -execdir primary does what you want very simply: it cd's to the directory each file is in, then executes the command with just the filename (no path):

find . -type f -execdir aunpack {} \;
于 2013-01-29T18:29:27.460 回答
1

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

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

于 2013-01-29T12:11:28.127 回答