awk更新目录中的文件名
awk to update filename in directory
在下面,我尝试使用 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("","var")}1' *.txt
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'
能否请您尝试以下(使用纯 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
您可以让 awk 为您创建 bash 命令,然后将 awk 的输出通过管道传输到 bash。
ls *.txt | awk -F'[_-]' -vvar=$id '{f=[=10=] ; sub(,var); print "mv", f, [=10=] } ' | bash
存在一些基本问题。
- 通过将 *.txt 传递给 awk - awk 将逐行打开目录中的每个 .txt 文件。相反,您只想处理目录列表(所以我添加了 ls *.txt )。
- 必须使用 awk 的 -v 选项设置变量 var。
- 您不需要引用“$5”和“var”。我怀疑您在解决问题后将一些旧代码粘贴到了您的问题中。
- - 的字段分隔符不足。您将丢失文件名的“_x1_y.txt”和“_x2_y.txt”部分。我添加了下划线作为额外的字段分隔符。
作为调试提示,您可以在采取任何操作之前查看 awk 将要执行的操作:
$ ls *.txt | awk -F'[_-]' -vvar=$id '{f=[=11=] ; sub(,var); print "mv", f, [=11=] } '
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
更改目录中一对文件名(在连字符和下划线之间)的一部分,并将值存储在变量中。下面确实执行但文件名没有改变。谢谢 :).
变量
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("","var")}1' *.txt
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'
能否请您尝试以下(使用纯 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
您可以让 awk 为您创建 bash 命令,然后将 awk 的输出通过管道传输到 bash。
ls *.txt | awk -F'[_-]' -vvar=$id '{f=[=10=] ; sub(,var); print "mv", f, [=10=] } ' | bash
存在一些基本问题。
- 通过将 *.txt 传递给 awk - awk 将逐行打开目录中的每个 .txt 文件。相反,您只想处理目录列表(所以我添加了 ls *.txt )。
- 必须使用 awk 的 -v 选项设置变量 var。
- 您不需要引用“$5”和“var”。我怀疑您在解决问题后将一些旧代码粘贴到了您的问题中。
- - 的字段分隔符不足。您将丢失文件名的“_x1_y.txt”和“_x2_y.txt”部分。我添加了下划线作为额外的字段分隔符。
作为调试提示,您可以在采取任何操作之前查看 awk 将要执行的操作:
$ ls *.txt | awk -F'[_-]' -vvar=$id '{f=[=11=] ; sub(,var); print "mv", f, [=11=] } '
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(如我提供的第一个代码中所示)。