Linux bash shell脚本-文件名中的空格



我已经很久没有写bash脚本了。

这是一个bash脚本,通过删除第一个句号分隔符之前的所有内容来复制和重命名文件:

#!/bin/bash
mkdir fullname
mv *.audio fullname
cd fullname
for x in * ;
do
  cp $x ../`echo $x | cut -d "." -f 2-`
done
cd ..
ls

对于没有嵌入空格的文件名工作得很好,但是对于带有空格的文件名则不行。

我如何改变代码来修复这个简单的Linux bash脚本?对于其他原因的改进代码的任何建议也将是受欢迎的。

示例文件名,有些带有嵌入的空格,有些没有(from link)

http://www.homenetvideo.com/demo/index.php?/Radio%20%28VLC%29

Ambient.A6.SOMA Space Station.audio
Blues.B9.Blues Radio U.K.audio
Classical.K3.Radio Stephansdom - Vienna.audio
College.CI.KDVS U of California, Davis.audio
Country.Q1.K-FROG.audio
Easy.G4.WNYU.audio
Eclectic.M2.XPN.audio
Electronica.E2.Rinse.audio
Folk.F1.Radionomy.audio
Hiphop.H1.NPR.audio
Indie.I4.WAUG.audio
Jazz.J6.KCSM.audio
Latin.L3.Mega.audio
Misc.X7.Gaydio.audio
News.N9.KQED.audio
Oldies.O1.Lonestar.audio
OldTime.Y1.Roswell.audio
Progressive.P1.Aural Moon.audio
Rock.R8.WXRT.audio
Scanner.Z3.Montreal.audio
Soul.S1.181.FM.audio
Talk.T2.TWiT.audio
World.W3.Persian.audio
http://lh5.googleusercontent.com/-QjLEiAtT4cw/U98_UFcWvvI/AAAAAAAABv8/gyPhbg8s7Bw/w681-h373-no/homenet-radio.png

当您处理可能包含空格的文件名时,您必须将它们引用为"$x"而不仅仅是$x。这就是导致cp命令失败的原因。

您的echo命令也有问题。尽管echo对简单的空格做了正确的事情——它将名为A B C的文件回显为A B C——但如果名称中有多个连续的空格,或者空格不是简单的空格字符,它仍然会失败。

不要将文件名传递给外部程序进行处理(这总是需要通过不允许使用空格的命令行),您应该尽可能使用bash内置函数进行字符串操作,例如${x%%foo}${x#bar}和类似的函数。手册页在"参数扩展"下描述了它们。

我的建议是:

#!/bin/bash
shopt -s nullglob
mkdir fullname
mv *.audio fullname
(
  cd fullname || exit
  for x in *; do
    cp "$x" "../${x#*.}"
  done
)
ls
  • nullglob防止*在没有文件匹配时显示自己。可选。
  • ()调用子shell,避免您切换回其他目录。
  • || exitcd更改目录失败时终止子shell。
  • ${x#*.}<first>.$x中移除并展开。

最新更新