带空格的文件 2

带空格的文件 2

我正在尝试使用 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

脚本在出现空格的地方将文件分成两部分。

脚本的输出是:

11237_712312955_2012-01-04
18_31_03

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

答案1

这里的问题是解析ls。考虑看一下这里:为什么不应该解析 ls 的输出

您不应该这样做的原因是 UNIX 允许在文件名中使用几乎任何字符,包括空格、换行符、逗号、管道符号以及您尝试用作分隔符的几乎所有其他字符(NUL 除外)。在默认模式下,如果标准输出不是终端,则使用ls换行符分隔文件名。除非您的文件名称中包含换行符,否则这样做没有问题。

答案2

天啊,太糟糕了。

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

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

查看Bash 指南有关参数扩展的更多详细信息。

答案3

你可以尝试一下这个。

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) :它从字符串 s 中返回从位置 a 开始的 b 个字符。参数 b 是可选的。

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

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

你得到 IP 即 192.168.1.133。注意 6 是从地址中的 a 开始的字符

因此,在正确的命令中,$2 是 $0(打印整行。)并且 index($0,$9) 匹配 $9 并打印第 9 列之前的所有内容。您可以将其更改为 index($0,$8),然后会看到输出更改为

# 10:55 File with spaces 2

`index(IN, FIND)' 这将在字符串 IN 中搜索字符串 FIND 的第一次出现,并返回该出现在字符串 IN 中的字符位置。

希望对您有所帮助。此外,如果您将此值分配给脚本中的变量,则需要将变量括在双引号中。否则,如果您对提取的文件名执行其他操作,您将收到错误。

相关内容