解压缩源参数

Gau*_*ier 5 command-line zip wildcards arguments

要将一堆 zip 文件从一个位置复制到另一个位置:

$ cp *.zip destination/
Run Code Online (Sandbox Code Playgroud)

将一堆 zip 文件解压缩到一个目录:

$ unzip \*.zip -d destination/
Run Code Online (Sandbox Code Playgroud)

man unzip 说:

星号前的反斜杠仅在 shell 扩展通配符时才需要,如在 Unix 中

让我感到困惑的是,这两个命令的行为方式似乎不同。他们为什么不呢?有没有办法知道或猜测每个命令的行为方式,而不是每次都记住或阅读手册页?

是否不同,因为它cp被实现为采用多个源参数而unzip不是?unzip可以取带通配符的字符串,为什么不实现取多个源文件呢?

获取源参数的标准方法是什么?是不是cp真的做得太多了?

mic*_*has 5

如果您有两个 zip 文件a.zip并且b.zip在当前目录中,则

$ cp *.zip destination/
Run Code Online (Sandbox Code Playgroud)

扩展到

$ cp a.zip b.zip destination/
Run Code Online (Sandbox Code Playgroud)

for 的语义cp是同时复制a.zip和复制b.zip到目的地。

如果你输入

$ cp \*.zip destination/
Run Code Online (Sandbox Code Playgroud)

它只是“扩展”到

$ cp '*.zip' destination/
Run Code Online (Sandbox Code Playgroud)

即它会尝试将名为“*.zip”的单个文件复制到目标,这不是您想要的。

另一方面,如果您键入

$ unzip *.zip -d destination/
Run Code Online (Sandbox Code Playgroud)

它将再次扩展到

$ unzip a.zip b.zip -d destination/
Run Code Online (Sandbox Code Playgroud)

语义unzip是在存档“a.zip”中找到一个名为“b.zip”的文件,这又不是您想要的。

如果你输入

$ unzip \*.zip -d destination/
Run Code Online (Sandbox Code Playgroud)

unzip命令不仅会尝试解压缩调用的文件*.zip,还会解压缩所有以.zip.

不同之处在于这两个命令对它们的参数的解释不同。