mv $1 $(echo $1 | sed s:\ :_:g)
这是一个简单的脚本,它重命名作为参数传递的文件,将空格交换为下划线。但是,例如,当我尝试将文件“ae i”重命名为“a_e_i”时,它会返回以下错误:
./spc2und a\ e\ i
mv: target `a_e_i' is not a directory
mv $1 $(echo $1 | sed s:\ :_:g)
这是一个简单的脚本,它重命名作为参数传递的文件,将空格交换为下划线。但是,例如,当我尝试将文件“ae i”重命名为“a_e_i”时,它会返回以下错误:
./spc2und a\ e\ i
mv: target `a_e_i' is not a directory
您需要在变量和命令替换周围加上双引号,以防止文件名中的空格被误认为是参数分隔符。此外,您不需要 sed,因为 bash 可以自己进行字符替换:
mv "$1" "${1// /_}"
编辑:我又发生了一些事情。mv -i
首先,如果已经有一个带下划线的文件(“a_e_i”或其他),你真的应该使用它。其次,这只适用于简单的文件名——如果你给它一个在封闭目录中带有空格的文件路径(例如“foo bar/baz quux/ae i”),它会尝试将它重命名为一个带有空格转换的目录,这不存在,导致喜剧。所以这里有一个更好的版本:
mv -i "$1" "$(dirname "$1")/$(basename "${1// /_}")"
顺便说一句,其他答案在用下划线替换空格后去掉了文件名上的双引号——这并不完全安全,因为还有其他有趣的字符可能仍然会造成麻烦。规则 1:如有疑问,请用双引号括起来以确保安全。规则2:有疑问。
试试这个 - 纯 bash:
mv "$1" ${1// /_}
您的 $1 扩展为 aei,然后将其用作 mv 的前三个参数,因此您的调用变为
mv a e i a_e_i
这就是您收到错误消息的原因。要解决这个问题,您所要做的就是引用 $1:
mv "$1" $(echo "$1" | sed s:\ :_:g)