如何在 shell 命令行脚本中重命名文件名 - 用空格替换下划线

ott*_*tts 9 command-line bash

我正在尝试重命名文件夹中的所有文件,用空格替换下划线。

i.e. this_is_a_test --> this is a test
Run Code Online (Sandbox Code Playgroud)

但不知何故我搞砸了引用

> for file in * ; do echo mv -v $file $(echo $file | sed 's/_/\\ /g') ; done
mv -v this_is_a_test this\ is\ a\ test
Run Code Online (Sandbox Code Playgroud)

看起来不错,但是如果我删除“回声”,mv就像删除了反斜杠一样抱怨

> for file in * ; do mv -v $file $(echo $file | sed 's/_/\\ /g') ; done
mv: target ‘test’ is not a directory
Run Code Online (Sandbox Code Playgroud)

有人可以指出我方法的错误吗?

kos*_*kos 8

使用rename

rename -n 's/_/ /g' *
Run Code Online (Sandbox Code Playgroud)

如果一切正常,请移除-n开关:

rename 's/_/ /g' *
Run Code Online (Sandbox Code Playgroud)
rename -n 's/_/ /g' *
Run Code Online (Sandbox Code Playgroud)


sou*_* c. 6

有一个小错误。使用"$newfile"而不仅仅是$newfile。你需要使用"

这是正确的。

for file in * ; do mv -v "$file" "$(echo $file | sed 's/_/\\ /g')" ; done
Run Code Online (Sandbox Code Playgroud)

如果你有文件名,this_is_a_test它会将文件重命名为this\ is\ a\ test.

如果要将文件重命名为this is a test. 使用下面的代码,

for file in * ; do mv -v "$file" "$(echo $file | sed 's/_/ /g')" ; done
Run Code Online (Sandbox Code Playgroud)

""在编写好的 shell 脚本时在内部使用变量是一个很好的做法。