Harimbola Santatra Asked: 2025-04-22 21:46:50 +0800 CST2025-04-22 21:46:50 +0800 CST 2025-04-22 21:46:50 +0800 CST `*\ *` 在 bash 中如何工作? 772 SuperUser有一个答案,它重命名包含空格的文件名: for f in *\ *; do mv "$f" "${f// /_}"; done 我不明白的部分是*\ *。 作者写道: *\ *选择所有名称中包含空格的文件作为 for 循环的输入。模式X选择所有名称中包含 X 的文件,对于特殊字符空格,我们必须使用斜杠进行转义,这样 Bash 就不会将其视为分隔不同参数的字符。 既然*不匹配空格,为什么*\ *当文件中只有一个空格时也会匹配具有多个空格字符的文件? bash 2 个回答 Voted Best Answer Chris Davies 2025-04-22T21:56:02+08:002025-04-22T21:56:02+08:00 通配符模式由两部分组成*\ *。 星号匹配零个或多个字符 反斜杠转义后面的字符,这样 Shell 就不会对其进行任何特殊处理。(这与用引号引起来的效果相同。) 您也可以写*\ *为*' '*或甚至*" "*,并且在任何情况下,空格都被视为任何可打印字符,而不是 shell 语法中的标记分隔符。 另请注意,为了解答您问题中的一个疑惑,*可以像匹配任何其他字符(或字符集)一样顺利地匹配空格。该模式先*\ *匹配任意字符,然后匹配空格,再匹配任意字符,因此它保证匹配的文件名中至少有一个空格。 最后,只要你的代码写得好,文件名中包含空格就没问题。例如,下面的代码可以处理任何文件名,无论它包含什么字符: for f in *; do printf '>> %s <<\n' "$f"; done # ‡ * 实际上,如果您使用的是 Unicode 语言环境,您可能会遇到一些字节序列与有效 Unicode 字符不对应的问题。您可以通过设置LC_CTYPE=C ‡ 这更容易,printf '>> %s<<\n' *但这不能说明我想要表达的观点 wobtax 2025-04-22T22:08:19+08:002025-04-22T22:08:19+08:00 这是因为*匹配任何字符串,包括带有空格的字符串。 我们用 代替空格X。假设当前目录中有以下所有文件: abc X defg hijk lmXXnop qXrsXt uvwXX (您可以通过运行来制作它们touch abc X defg hijk lmXXnop qXrsXt uvwXX。) 现在通配符模式*匹配所有这些: bash-3.2$ echo * X abc defg hijk lmXXnop qXrsXt uvwXX 如果我添加一个X,则该模式的意思是“以 结尾的任何内容X”: bash-3.2$ echo *X X uvwXX (请注意,这包括uvwXX,它有两个Xs。这是因为*匹配uvwX。) 如果我添加另一个 X,则该模式的意思是“以两个 X' 结尾的任何东西”: bash-3.2$ echo *XX uvwXX 但如果我添加另一个*,则该模式表示“任何包含至少一个X”: bash-3.2$ echo *X* X lmXXnop qXrsXt uvwXX
通配符模式由两部分组成
*\ *
。您也可以写
*\ *
为*' '*
或甚至*" "*
,并且在任何情况下,空格都被视为任何可打印字符,而不是 shell 语法中的标记分隔符。另请注意,为了解答您问题中的一个疑惑,
*
可以像匹配任何其他字符(或字符集)一样顺利地匹配空格。该模式先*\ *
匹配任意字符,然后匹配空格,再匹配任意字符,因此它保证匹配的文件名中至少有一个空格。最后,只要你的代码写得好,文件名中包含空格就没问题。例如,下面的代码可以处理任何文件名,无论它包含什么字符:
* 实际上,如果您使用的是 Unicode 语言环境,您可能会遇到一些字节序列与有效 Unicode 字符不对应的问题。您可以通过设置
LC_CTYPE=C
‡ 这更容易,
printf '>> %s<<\n' *
但这不能说明我想要表达的观点这是因为
*
匹配任何字符串,包括带有空格的字符串。我们用 代替空格
X
。假设当前目录中有以下所有文件:abc
X
defg
hijk
lmXXnop
qXrsXt
uvwXX
(您可以通过运行来制作它们
touch abc X defg hijk lmXXnop qXrsXt uvwXX
。)现在通配符模式
*
匹配所有这些:如果我添加一个
X
,则该模式的意思是“以 结尾的任何内容X
”:(请注意,这包括
uvwXX
,它有两个X
s。这是因为*
匹配uvwX
。)如果我添加另一个
X
,则该模式的意思是“以两个X
' 结尾的任何东西”:但如果我添加另一个
*
,则该模式表示“任何包含至少一个X
”: