自从我做了很多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脚本?任何因其他原因改进代码的建议也会受到欢迎。
示例文件名,一些包含嵌入空格,一些不包含(来自链接)
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
答案 0 :(得分:2)
每当您处理可能包含空格的文件名时,您必须将其引用为"$x"
,而不仅仅是$x
。这导致cp
命令失败的原因。
您的echo
命令也存在问题。虽然echo
对简单空格做了正确的事情 - 它将名为A B C
的文件作为A B C
回显 - 如果名称中有多个连续空格,或者空格中有空格,它仍然会失败不是简单的空间角色。
除了将文件名传递给外部程序进行处理(总是需要通过whitespace-hostile命令行)之外,您应该尽可能使用bash内置函数进行字符串操作,例如: ${x%%foo}
,${x#bar}
和类似的功能。手册页在"参数扩展"。
答案 1 :(得分:1)
这是我的建议:
#!/bin/bash
shopt -s nullglob
mkdir fullname
mv *.audio fullname
(
cd fullname || exit
for x in *; do
cp "$x" "../${x#*.}"
done
)
ls
nullglob
会阻止*
展示自己。只是可选的。()
召唤一个子shell,使您无法更改回另一个目录。|| exit
无法更改目录,cd
将终止子shell。${x#*.}
从<first>.
移除$x
并展开。