AWK和包含空格的文件名。

我试图用awkparsing文件来改变他们的名字。 一切都很顺利,直到我开始做这个与文件名空间的文件。 文件名是类似11237_712312955_2012-01-04 18_31_03.wav ,我想从文件名replaceWAV。 这是我的代码的例子:

ls | awk -F\. '{print $1}'

我在控制台运行后,事情是好的,我没有扩展名的文件名。

例如:文件11237_712312955_2012-01-04 18_31_03.wav

ls | awk -F\. '{print $1}' ls | awk -F\. '{print $1}' 控制台中的ls | awk -F\. '{print $1}'我正在创build:

11237_712312955_2012-01-04 18_31_03 ,这是正确的。

但是当我把它写在我的脚本中时:

 #!/bin/bash for i in $(ls); do FILENAME= echo $i | awk -F\. '{print $1}' ; #problematic line echo $FILENAME done 

脚本将文件分割成两个空间发生的地方。

脚本的输出是:

 11237_712312955_2012-01-04
 18_31_03

如何使我的脚本正常工作?

这里的问题是用lsparsing。 考虑看看这里: 为什么你不应该分析ls的输出 。

之所以不这样做,是因为UNIX几乎允许文件名中的任何字符,包括空格,换行符,逗号,pipe道符号,以及其他任何您尝试用作除NUL之外的分隔符的内容。 在默认模式下,如果标准输出不是terminal,则ls用换行符分隔文件名。 这是没有问题的,直到你有一个名字换行的文件。

哦,我的天啊,太糟糕了。

你的脚本使用bash; 我build议你这样做:

 #!/bin/bash for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done 

有关参数扩展的更多详细信息,请参阅Bash指南

你可以试试这个。

 awk '{print substr($0, index($0,$9))}' 

例如,这是ls命令的输出:

-rw-R – R–。 1 root root 73834496 Dec 6 10:55带空格的文件2

如果你这样使用简单的awk

 # awk '{print $9}' 

它只返回

 # File 

如果使用完整的命令

 # awk '{print substr($0, index($0,$9))}' 

我得到了整个输出

文件与空间2

这里substr(s,a,b):它从strings返回b个字符的字符,从位置a开始。 参数b是可选的。

例如,如果匹配是addr:192.168.1.133并且您使用substr如下

 # awk '{print substr($2,6)}' 

你得到的IP即192.168.1.133。 注意6是从一个addr开始的字符

所以在适当的命令$ 2是$ 0(打印整行)和索引($ 0,$ 9)匹配$ 9并打印在第9列之前的所有内容。您可以将其更改为索引($ 0,$ 8)并查看输出更改至

 # 10:55 File with spaces 2 

`index(IN,FIND)'在stringIN中searchstringFIND的第一个匹配项,并返回stringIN中string的位置。

我希望它有帮助。 此外,如果您将此值分配给脚本中的variables,则需要将variables括在双引号中。 除此之外,如果您正在为提取的文件名执行其他操作,则会出现错误。