awk 更新目录中的文件名

Posted

技术标签:

【中文标题】awk 更新目录中的文件名【英文标题】:awk to update filename in directory 【发布时间】:2021-03-07 12:33:30 【问题描述】:

在下面,我尝试使用awk 更改目录中一对文件名(连字符和下划线之间)的一部分,并将值存储在变量中。下面的内容会执行,但文件名不会改变。谢谢你:)。

变量

id=aaaaa

目录中的文件

00-0000-xxx-y-zzz_x1_y.txt
00-0000-xxx-y-zzz_x2_y.txt

想要的

00-0000-xxx-y-aaaaa_x1_y.txt
00-0000-xxx-y-aaaaa_x2_y.txt

awk

awk -F'-' var=$id'sub("$5","var")1' *.txt

【问题讨论】:

awk 正在更改文件内容而不是文件名本身。您将需要使用rename perl 实用程序 shell 是一种用于操作(创建、销毁、重命名等)文件和进程的工具。 awk 是一个操作文本的工具。您尝试使用错误的工具来完成此任务。 【参考方案1】:

awk 正在更改文件内容,而不是文件名本身。

您可以像这样使用rename perl 实用程序来代替awk:

id='aaaaa'
rename -n "s/^(.*)-[^_]+_/\$1-$id_/" *.txt

'00-0000-xxx-y-zzz_x1_y.txt' would be renamed to '00-0000-xxx-y-aaaaa_x1_y.txt'

【讨论】:

【参考方案2】:

您能否尝试以下操作(使用纯 bash 解决方案),以下操作将遍历所有 .txt 文件,并且仅在终端上打印重命名命令。如果您对终端上显示的结果感到满意,请将 | bash 附加到解决方案中。注意,请在运行以下命令之前设置id=aaaaa

for file in *.txt
do
   echo "mv $file $file%-*-$id_$file#*_"
done


一旦您对上述结果感到满意,然后运行以下命令将文件实际重命名为新文件。

for file in *.txt
do
   echo "mv $file $file%-*-$id_$file#*_"
done | bash

【讨论】:

【参考方案3】:

您可以让 awk 为您创建 bash 命令,然后将 awk 的输出通过管道传输到 bash。

ls *.txt | awk -F'[_-]' -vvar=$id 'f=$0 ; sub($5,var); print "mv", f, $0  ' | bash

存在许多基本问题。

    通过将 *.txt 传递给 awk - awk 将逐行打开目录中的每个 .txt 文件。相反,您只想处理目录列表(所以我添加了 ls *.txt )。 变量 var 必须使用 awk 的 -v 选项设置。 您不需要引用“$5”和“var”。我怀疑你在问题中粘贴了一些旧代码,因为你得到了它的工作。 - 的字段分隔符不足。您将丢失文件名的“_x1_y.txt”和“_x2_y.txt”部分。我添加了下划线作为额外的字段分隔符。

作为调试提示,您可以在采取任何操作之前查看 awk 将要执行的操作:

$ ls *.txt | awk -F'[_-]' -vvar=$id 'f=$0 ; sub($5,var); print "mv", f, $0  '
mv 00-0000-xxx-y-zzz_x1_y.txt 00-0000-xxx-y-aaaaa_x1_y.txt
mv 00-0000-xxx-y-zzz_x2_y.txt 00-0000-xxx-y-aaaaa_x2_y.txt

如果上面看起来不错,只需将输出通过管道传输到 bash(如我提供的第一个代码中所示)。

【讨论】:

以上是关于awk 更新目录中的文件名的主要内容,如果未能解决你的问题,请参考以下文章

使用行数中的值更新最后一个字段(awk?)

使用 Python 按更新时间识别和加载目录中的最后一个 csv 文件

iOS应用程序更新文件目录中的文件问题

Docker 绑定挂载目录中的文件未更新

将awk模式应用于具有相同名称的所有文件,将每个文件输出到新文件

awk从入门到入土(19)awk扩展插件,让awk如虎添翼