了解 Linux 环境反斜杠和星号的使用

Noe*_*uli 2 zip shell-script

我在 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 的结果时,它没有得到值,因此它失败了。

  1. 何时在调用 konsole 命令时使用“\”或“*”或将两者结合使用?
  2. 如何将 zip 文件解压缩到具有自己名称的目录?

Fox*_*Fox 5

unzip特别是的用法可能会导致一些混乱。它可以称为

$ unzip x.zip file-1 file-2 file-3
Run Code Online (Sandbox Code Playgroud)

wherefile-1等是包含在x.zip. 对于本答案的其余部分,我将假设当前目录包含两个.zip文件:x.zipy.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)