我试图用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
如何使我的脚本正常工作?
这里的问题是用ls
parsing。 考虑看看这里: 为什么你不应该分析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))}'
我得到了整个输出
这里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括在双引号中。 除此之外,如果您正在为提取的文件名执行其他操作,则会出现错误。