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

Kei*_*vky 1 bash space underline file-rename

mv $1 $(echo $1 | sed s:\ :_:g)
Run Code Online (Sandbox Code Playgroud)

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

./spc2und a\ e\ i 
mv: target `a_e_i' is not a directory
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 7

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

mv "$1" "${1// /_}"
Run Code Online (Sandbox Code Playgroud)

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

mv -i "$1" "$(dirname "$1")/$(basename "${1// /_}")"
Run Code Online (Sandbox Code Playgroud)

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


jm6*_*666 5

试试这个 - 纯粹的bash:

mv "$1" ${1// /_}
Run Code Online (Sandbox Code Playgroud)