解压缩源参数

解压缩源参数

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

$ cp *.zip destination/

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

$ unzip \*.zip -d destination/

man unzip说:

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

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

它是否有所不同,因为cp它的实现是为了获取多个源参数,而unzip不是?unzip可以接受带有通配符的字符串,为什么不实现接受多个源文件呢?

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

答案1

如果您有两个 zip 文件a.zip并且b.zip位于当前目录中,那么

$ cp *.zip destination/

扩展到

$ cp a.zip b.zip destination/

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

如果您输入

$ cp \*.zip destination/

它只是“扩展”为

$ cp '*.zip' destination/

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

另一方面,如果您输入

$ unzip *.zip -d destination/

它将再次扩展到

$ unzip a.zip b.zip -d destination/

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

如果您输入

$ unzip \*.zip -d destination/

unzip命令并不只是尝试解压缩所调用的文件*.zip,而是会解压缩所有以.zip.

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

答案2

相反,unzip 的作用太大了。 cp 不需要解析文件名,它所需要做的就是循环它们。

另一方面,Unzip 需要查看参数是否为通配符,检查目录列表以查看与通配符匹配的内容,然后循环遍历这些内容。请注意,shell 已经能够匹配和扩展通配符,因此解压缩是重复功能。

相关内容