我在 Linux 环境中有两个相关的问题。
我很困惑何时使用反斜杠\
并结合星号“*”。当我尝试运行 Unzip *.zip 时,命令失败,直到我转义它。为什么会这样?
developer@tz:~/f$ bash -version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
developer@tz:~/f$ unzip *.zip
Archive: abstract.zip
caution: filename not matched: date-function.zip
developer@tz:~/f$ unzip \*.zip
Archive: abstract.zip
inflating: abstract.xsl
Archive: date-function.zip
warning [date-function.zip]: zipfile is empty
1 archive was successfully processed.
1 archive had warnings but no fatal errors.
developer@tz:~/f$ ls *.zip
abstract.zip date-function.zip
developer@tz:~/f$ ls \*.zip
ls: cannot access '*.zip': No such file or directory
Run Code Online (Sandbox Code Playgroud)
关于单线函数的类似问题。
假设我有 zip 文件: foo.zip 和 bar.zip 在同一目录中,我需要解压缩两者;当我做:
ls *.zip | xargs -IZIP basename -s .zip ZIP
Run Code Online (Sandbox Code Playgroud)
上面的命令将列出:konsole 上的 foo 和 bar,但是当我运行时:
ls *.zip | xargs -IZIP unzip ZIP -d $( basename -s .zip ZIP )
Run Code Online (Sandbox Code Playgroud)
它无法运行,因为当我传递 base 的结果时,它没有得到值,因此它失败了。
unzip
特别是的用法可能会导致一些混乱。它可以称为
$ unzip x.zip file-1 file-2 file-3
Run Code Online (Sandbox Code Playgroud)
wherefile-1
等是包含在x.zip
. 对于本答案的其余部分,我将假设当前目录包含两个.zip
文件:x.zip
和y.zip
.
当 shell 执行 glob 扩展(通配符,如*
或?
)时,每个匹配的文件都成为一个单独的参数。所以
$ unzip *.zip
Run Code Online (Sandbox Code Playgroud)
变成
$ unzip x.zip y.zip
Run Code Online (Sandbox Code Playgroud)
请记住,此语法的意思是“y.zip
从存档中提取文件x.zip
”。为了允许多个存档,unzip
还会处理通配符。如果要让unzip
处理通配符而不是 shell,则必须引用或转义它们:
$ unzip \*.zip
Run Code Online (Sandbox Code Playgroud)
或者
$ unzip '*.zip'
Run Code Online (Sandbox Code Playgroud)