简单的bash脚本,用于将空格更改为文件名中的下划线

时间:2011-07-21 20:05:10

标签: bash space file-rename underline

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:5)

试试这个 - 纯粹的bash:

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

答案 2 :(得分:2)

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

mv a e i a_e_i

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

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