Naidim回答了这个问题: How to replace spaces in file names using a bash script有人可以解释这个工作Bash代码吗?
这是唯一的答案我可以得到为我工作,但我不明白我在看。
for f in *\ *; do mv "$f" "${f// /_}"; done
- 我不知道for循环只想通过所有的文件中搜索与此基本语法。
- 我看到mv声明,但是这个命令是什么扩展?
Naidim回答了这个问题: How to replace spaces in file names using a bash script有人可以解释这个工作Bash代码吗?
这是唯一的答案我可以得到为我工作,但我不明白我在看。
for f in *\ *; do mv "$f" "${f// /_}"; done
其分解:
*\ *
是文件名glob模式。这扩展到当前目录中的所有文件中都有空格。通常会将参数与命令分开(这会在全局扩展之前发生),但在使其成为文字空间并因此成为全局模式的一部分之前有一个转义。
for f in *\ *
;是一个for循环,循环遍历in
之后的所有内容 - 在这种情况下,glob扩展的文件列表。变量f
将依次设置为每个文件名,并且将为每个文件名执行直至done
命令的代码。
"$f"
是一个变量扩展。变量扩展之前字拆分(不像glob扩展),所以引号是必要的,以保持文件名中的空格togther作为单个参数的一部分,而不是分成多个参数。
${f// /_}
是一个带替代的变量扩展。最初的//
表示该模式重复应用于变量内容,而不仅仅是一次。 / /
之间的空格是要搜索的模式,最后的_
是替换,因此f
(循环中的文件名)中的所有空格都将替换为下划线。
要了解此代码,您可能需要了解更多关于globbing和Bash parameter expansion的信息。
*\ *
=>是匹配在当前目录中具有一个以上的空间在他们${f// /_}
=>击参数扩展替换用-
空间在可变f
(1所有条目中的glob:1更换)因此,循环于当前目录(文件,目录,在其名称中含有空格,并将其重命名为到位的空间使用_
名称符号链接等)拿起所有条目。
令人困惑的扩展是参数替换。表格${foo/bar/baz}
用于搜索$foo
中的字符串bar
,并用baz
替换它。如果bar
以/
开头(如循环中的情况),则全部出现的bar
被替换为baz
。有关更多信息,您可以阅读bash手册页中的Parameter Expansion
标题。
哇,谢谢!我们中有些人正在试图打破这种情况,但从未见过这样的命令。 – Ambrose