有人可以解释此工作bash代码吗?



naidim回答了这个问题:如何使用bash脚本替换文件名中的空格

这是我为我工作的唯一答案,但我不明白我在看什么。

for f in * *; do mv "$f" "${f// /_}"; done
  1. 我不知道for循环只会使用此基本语法搜索所有文件。
  2. 我看到了MV语句,但是该命令扩展是什么?

分解它:

  • * *是一个文件名球模式。这将扩展到当前目录中具有空格的所有文件。通常,空间将参数与命令分开(发生在地球扩展之前(,但是在逃脱之前,它在它使其成为字面空间并因此是Glog模式的一部分。

  • for f in * *;是用于循环的,在in之后循环循环 - 在这种情况下,来自全球扩展的文件列表。变量f将依次将每个文件名设置为每个文件名,并且将对每个文件名执行done命令的代码。

  • "$f"是可变扩展。可变扩展在单词拆分之前(与Glob扩展不同(,因此,必须将空格保留为单个参数的一部分而不是分为多个参数。

    是必要的。 。
  • ${f// /_}是替换的变量扩展。最初的//表示将模式重复应用于变量内容,而不仅仅是一次。/ /之间的空间是要搜索的模式,最终的_是替换,因此f中的所有空格(来自循环中的文件名(将被底漆替换。

您可能需要阅读有关Globbing和Bash参数扩展以了解此代码的更多信息。

  • * * =>是与当前目录中的所有条目相匹配的全球,它们中有一个空格
  • ${f// /_} => bash参数扩展,在变量f中替换了 -的空间(1:1替换(

因此,循环在当前目录(文件,目录,符号链接等(中获取所有条目,它们的名称为空间,并将其重命名为使用_代替空格的名称。

<</p>

令人困惑的扩展是参数替代。${foo/bar/baz}表格用于搜索$foo内部的字符串bar并用baz替换。如果bar/开头(与循环中的情况一样(,则所有出现bar的出现将被baz替换。有关更多信息,您可以阅读Bash Manpage中的Parameter Expansion

相关内容

  • 没有找到相关文章

最新更新