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
答案 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)