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

时间:2014-08-04 08:24:40

标签: linux bash filenames spaces

自从我做了很多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

http://lh5.googleusercontent.com/-QjLEiAtT4cw/U98_UFcWvvI/AAAAAAAABv8/gyPhbg8s7Bw/w681-h373-no/homenet-radio.png

2 个答案:

答案 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并展开。