我正在尝试使用 awk 解析文件以更改其名称。一切都很顺利,直到我开始对文件名中有空格的文件执行此操作。文件名类似于11237_712312955_2012-01-04 18_31_03.wav
我想从文件名中替换 wav 。这是我的代码示例:
ls | awk -F\. '{print $1}'
在控制台中运行此命令后,一切正常,并且我得到了没有扩展名的文件名。
示例:文件 11237_712312955_2012-01-04 18_31_03.wav
后
ls | awk -F\. '{print $1}'
控制台我在歌厅:
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
Run Code Online (Sandbox Code Playgroud)
脚本在出现空间的地方将文件分成两部分。
脚本的输出是:
11237_712312955_2012-01-04
18_31_03
Run Code Online (Sandbox Code Playgroud)
如何让我的脚本正常工作?
Eug*_*e S 11
这里的问题是用ls
. 考虑看看这里:为什么你不应该解析 ls 的输出。
你不应该这样做的原因是因为 UNIX 允许文件名中的几乎所有字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 之外的分隔符的任何其他字符。在默认模式下,如果标准输出不是终端,则ls
用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。
天啊,这太可怕了。
您的脚本使用 bash;我建议你这样做:
#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Run Code Online (Sandbox Code Playgroud)
有关参数扩展的更多详细信息,请参阅Bash 指南。