AWK 和其中包含空格的文件名。

B14*_*4D3 6 linux bash awk

我正在尝试使用 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用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。


ada*_*ptr 6

天啊,这太可怕了。

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

#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done
Run Code Online (Sandbox Code Playgroud)

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