繁体   English   中英

使用bash脚本将下划线替换为空格

[英]Replace underscores to whitespaces using bash script

如何使用Bash Script在多个文件名中用空格替换所有下划线字符? 使用此代码,我们可以将下划线替换为破折号。 但是它如何与空白一起使用?

for i in *.mp3;
do x=$(echo $i | grep '_' | sed 's/_/\-/g');
if [ -n "$x" ];
then mv $i $x;
fi;
done;

谢谢!

应该这样做:

for i in *.mp3; do
    [[ "$i" = *_* ]] && mv -nv -- "$i" "${i//_/ }"
done
  • 测试[[ "$i" = *_* ]]测试,如果文件名包含任何下划线,如果这样做,将mv的文件,其中"${i//_/ }"扩展到i ,所有的下划线有被空格代替(请参阅shell参数扩展 )。
  • mv的选项-n表示no clobber :不会覆盖任何存在的文件(相当安全)。 可选的
  • 选项-vmvverbose :会说出它在做什么(如果您想看看正在发生什么)。 非常可选
  • --是在这里告诉mv参数将从此处开始。 这始终是一个好习惯,就像文件名以-开头时, mv会尝试将其解释为选项,并且脚本将失败。 很好的做法

另一条评论:使用glob时(例如, for i in *.mp3 ),设置shopt -s nullglobshopt -s failglob总是很好。 如果没有文件与模式匹配,前者将使*.mp3扩展为*.mp3 (因此不会执行循环),后者将显式引发错误。 如果没有这些选项,如果不存在与*.mp3匹配的文件,则将使用i的逐字值*.mp3执行循环内的代码,这可能会导致问题。 (好吧,由于守护[[ "$i" = *_* ]] ,在这里不会有任何问题,但是始终使用这两个选项是一个好习惯)。

希望这可以帮助!

您的脚本使用空格失败的原因是,传递给mv时,文件名被视为多个参数。 您需要引用文件名,以便将每个文件名视为一个单独的文件。 使用以下命令更新脚本中的相关行:

mv "$i" "$x"  
# where $i is your original filename, and $x is the new name

顺便说一句,如果您安装了重命名命令perl版本,则可以跳过该脚本并使用以下命令完成相同的操作:

rename 's/_/ /' *.mp3

或者,如果您拥有更经典的rename命令

rename "_" " " *.mp3

使用tr

tr '_' ' ' <file1 >file2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM