[英]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
:不会覆盖任何存在的文件(相当安全)。 可选的 。 -v
到mv
是verbose
:会说出它在做什么(如果您想看看正在发生什么)。 非常可选 。 --
是在这里告诉mv
参数将从此处开始。 这始终是一个好习惯,就像文件名以-
开头时, mv
会尝试将其解释为选项,并且脚本将失败。 很好的做法 。 另一条评论:使用glob时(例如, for i in *.mp3
),设置shopt -s nullglob
或shopt -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.