【问题标题】:simple bash script to change spaces to underlines in a file name用于将空格更改为文件名中的下划线的简单 bash 脚本
【发布时间】:2011-10-10 13:22:30
【问题描述】:
mv $1 $(echo $1 | sed s:\ :_:g)

这是一个简单的脚本,它重命名作为参数传递的文件,将空格交换为下划线。但是,例如,当我尝试将文件“a e i”重命名为“a_e_i”时,它会返回以下错误:

./spc2und a\ e\ i 
mv: target `a_e_i' is not a directory

【问题讨论】:

    标签: bash space file-rename underline


    【解决方案1】:

    您需要在变量和命令替换周围加上双引号,以防止文件名中的空格被误认为是参数分隔符。此外,您不需要 sed,因为 bash 可以自己进行字符替换:

    mv "$1" "${1// /_}"
    

    编辑:我又想到了几件事。首先,你真的应该使用mv -i,以防已经有一个带下划线的文件(“a_e_i”或其他)。其次,这只适用于简单的文件名——如果你给它一个在封闭目录中带有空格的文件路径(例如“foo bar/baz quux/aei”),它会尝试将其重命名为一个带有空格转换的目录,这不存在,导致喜剧。所以这里有一个更好的版本:

    mv -i "$1" "$(dirname "$1")/$(basename "${1// /_}")"
    

    顺便说一句,其他答案在用下划线替换空格后省略了文件名上的双引号 - 这并不完全安全,因为还有其他有趣的字符可能仍然会造成麻烦。规则 1:如有疑问,请用双引号括起来以确保安全。规则 2:有疑问。

    【讨论】:

      【解决方案2】:

      您的 $1 扩展为 a e i,然后将其用作 mv 的前三个参数,因此您的调用变为

      mv a e i a_e_i
      

      这是您收到错误消息的原因。 要解决此问题,您只需引用 $1:

      mv "$1" $(echo "$1" | sed s:\ :_:g)
      

      【讨论】:

        【解决方案3】:

        试试这个 - 纯 bash:

        mv "$1" ${1// /_}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-07
          • 2021-01-26
          • 2010-12-14
          • 2015-06-08
          • 1970-01-01
          • 2014-09-26
          • 1970-01-01
          • 2022-11-23
          相关资源
          最近更新 更多