Regex awk更新目录中的文件名

Regex awk更新目录中的文件名,regex,shell,awk,rename,file-rename,Regex,Shell,Awk,Rename,File Rename,在下面的示例中,我尝试使用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("

在下面的示例中,我尝试使用
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实用程序代替awk,如下所示:

id='aaaaa'
重命名-n“s/^(.*)-[^\u]+\ u/\$1-${id}\u/”*.txt
“00-0000-xxx-y-zzz_x1_y.txt”将重命名为“00-0000-xxx-y-aaaaaaa_x1_y.txt”

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

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

您可以让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正在更改文件内容,而不是文件名本身。您需要使用
    rename
    perl实用程序shell是一种用于操作(创建、销毁、重命名等)文件和进程的工具。Awk是一种处理文本的工具。您试图使用错误的工具执行此任务。