要将一堆 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 已经能够匹配和扩展通配符,因此解压缩是重复功能。