naidim回答了这个问题:如何使用bash脚本替换文件名中的空格
这是我为我工作的唯一答案,但我不明白我在看什么。
for f in * *; do mv "$f" "${f// /_}"; done
- 我不知道for循环只会使用此基本语法搜索所有文件。
- 我看到了MV语句,但是该命令扩展是什么?
分解它:
-
* *
是一个文件名球模式。这将扩展到当前目录中具有空格的所有文件。通常,空间将参数与命令分开(发生在地球扩展之前(,但是在逃脱之前,它在它使其成为字面空间并因此是Glog模式的一部分。
-
for f in * *
;是用于循环的,在in
之后循环循环 - 在这种情况下,来自全球扩展的文件列表。变量f
将依次将每个文件名设置为每个文件名,并且将对每个文件名执行done
命令的代码。 -
"$f"
是可变扩展。可变扩展在单词拆分之前(与Glob扩展不同(,因此,必须将空格保留为单个参数的一部分而不是分为多个参数。 -
${f// /_}
是替换的变量扩展。最初的//
表示将模式重复应用于变量内容,而不仅仅是一次。/ /
之间的空间是要搜索的模式,最终的_
是替换,因此f
中的所有空格(来自循环中的文件名(将被底漆替换。
您可能需要阅读有关Globbing和Bash参数扩展以了解此代码的更多信息。
-
* *
=>是与当前目录中的所有条目相匹配的全球,它们中有一个空格 -
${f// /_}
=> bash参数扩展,在变量f
中替换了-
的空间(1:1替换(
因此,循环在当前目录(文件,目录,符号链接等(中获取所有条目,它们的名称为空间,并将其重命名为使用_
代替空格的名称。
令人困惑的扩展是参数替代。${foo/bar/baz}
表格用于搜索$foo
内部的字符串bar
并用baz
替换。如果bar
以/
开头(与循环中的情况一样(,则所有出现bar
的出现将被baz
替换。有关更多信息,您可以阅读Bash Manpage中的Parameter Expansion
。