awk批量修改文件名

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作。

一、AWK基本认识

数据可以来自标准输入也可以是管道或文件。

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符"&&"表示"与"、"||表示"或"、"!"表示"非";还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。

1.AWK命令基本格式

a.awk  选项  '模式或条件{操作}'  文件1 文件2 ...

b.awk -f 脚本文件 文件1  文件2 ..

2.AWK的工作原理

a.逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

b.当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出,如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。

3.应用与拓展

利用awk命令,批量修改文件名,有点大材小用。作为对awk命令的理解与掌握、批量修改文件名的特殊方法等,值得推荐。

awk作为一门编程语言,功能强大。与正则结合,可处理文本文件的绝大多数工作。基本语法、参数等方面的介绍,不再赘述。

二、项目训练

从简至繁,共讨论五个典型案例。

1.案例1

——修改后缀

把当前目录下的.conf文件全部修改为.txt文件

2.案例2

——修改前缀

把当前目录下的test开头的文件全部修改为demo开头的文件

3.案例3

——调整格式

调整当前目录下子目录下的2022-05-01等含日期的文件为.分隔的文件

4.案例4

——难度修改

将当前目录下所有子目录下以a开头的.cpp文件改名为以b开头的.c文件

5.案例5

——多项修改

将当前目录下所有子目录下以ab开头的.sh文件修改为以AB开头的.py文件,并将所有.jpg文件修改为test_01.jpg等格式

在批量修改文件名时,需要用到基本命令ls,find,xargs,mv等,其常用选项及使用,可自行查询搜索。

三、案例剖析

1.修改后缀

把当前目录下的.conf文件全部修改为.txt文件

批量修改文件名后缀,是最基本的操作,有许多方法,用awk只是小试牛刀。

find . -name "*.conf" | awk -F "." '{print .$2}' | xargs -i -t mv ./{}.conf ./{}.txt

仅仅查找当前目录下的*.conf文件,可简写为ls  *.conf或者find *.conf

此代码以.为字段分隔符,.前为$1 ,.后为$2

2.修改前缀

把当前目录下的test开头的文件全部修改为demo开头的文件

使用awk函数进行字符串替换 ls test* | awk '{str=$0; sub("test","demo",str);print $0" "str }'

命令含义是用ls命令展示当前目录下的test开头的文件,然后使用awk处理

awk处理的内容:awk使用sub函数把str字符串中的test替换为demo字符串,然后打印完整行和处理后的str字符串并且用空格拼接

使用xargs命令将修改前、修改后的文件名传入mv命令作为参数

ls test* | awk '{str=$0; sub("test","demo",str);print $0" "str }' | xargs -n2 mv

3.调整格式

调整当前目录下子目录下的2022-05-01等含日期的文件为.分隔的文件

find test/ -name 2022* |awk 'BEGIN{FS="-";OFS="_"}{printf "mv "$0;$1=$1;print " /tmp/"$0}'

FS是原始列的分隔符,OFS是新定义的列分隔符,$1=$1是为了让新定义的分隔符强制生效

printf "mv "$0;$1=$1;print " /tmp/"$0 相当于拼凑了一句mv的命令。

这样只是输出了命令,并没有执行,要执行需要|sh,也可写|bash。

find test/ -name 2022* |awk 'BEGIN{FS="-";OFS="_"}{printf "mv "$0;$1=$1;print " /tmp/"$0}' | sh

4.难度修改

将当前目录下所有子目录下以a开头的.cpp文件改名为以b开头的.c文件

sub是英文substitute的简写,执行替换操作时仅进行一次。gsub是全局执行sub,多次操作,其中g是全局的意思。

sub和gsub的功能与使用方法,网上有许多介绍,可自行搜索查询。

下次代码的原理,就是分别替换路径、首字母、后缀,最后组合执行shell命令mv。

find ./ -name "a*.cpp" | awk '{head=$0;gsub(/\/a[^\/]*\.cpp$/,"",head);body=$0;gsub(/^\..*\/a/,"/b",body);sub(/\.cpp$/,".c",body);sub(/$/,body,head);origin=$0;$0=head;system("mv "origin" "$0)}'

分号;是多个命令的连接符,各个命令按从左向右顺序执行。

代码的关键是变量交换、shell命令如何执行等。

(详细说明见最后PS)

5.多项修改

将当前目录下所有子目录下以ab开头的.sh文件修改为以AB开头的.py文件,并将所有.jpg文件修改为test_01.jpg等格式(01 02 03…序号作为文件名主要构成)。

a.批量处理.sh文件

find ./ -name "ab*.sh" -o -name "*.jpg" | awk { head=$0;gsub(/\/ab[^\/]*\.sh$/,"",head);body=$0;gsub(/^\..*\/ab/,"/AB",body);sub(/\.sh$/,".py",body);sub(/$/,body,head);origin=$0;$0=head;system("mv "origin" "$0)}

(详细说明见最后PS)

b.批量处理.jpg文件

ls *.jpg | awk 'BEGIN{tag = 1} {printf("mv %s test_%02d.jpg\n", $0, tag); tag++}' | bash

  PS:4-5中主要代码解释

        # 第一步:把文件路径取出来
        head=$0;  # 把管道接收的数据赋值给一个变量(文件的头部路径)
        gsub(/\/b[^\/]*\.c$/,"",head); # 把head变量中的文件名全部置为空,命令执行>
完后head变量仅保存文件的路径  PS:gsub全局替换
        # 第二步:把文件名修改成需要的a --?b  .cpp --?.c
        body=$0; # 把管道接收的数据赋值给一个变量(文件的尾部名称)
        gsub(/^\..*\/b/,"/a",body); # 把body变量中的文件名首字母a前面(左边的路径>
与a本身)的内容全部替换为b
        sub(/\.c$/,".cpp",body); # 把body变量中的文件名最右边的后缀.cpp全部替换为.
c。命令执行完后body变量仅保存文件名b*.c  PS:sub仅替换一次(匹配替换)
        # 第三步:把修改好文件名的变量body与前面的路径变量head合并为一个完整的文件
名(路径+文件名)
        sub(/$/,body,head); # 把变量head的结束符$替换为变量body
        # 第四步: 执行重命名命令mv
        origin=$0; # 把管道接收的数据赋值给一个新变量origin
        $0=head; # 把替换完整的文件名再赋值给$0
        # 前两步是十分必要的,相当于把要处理的数据刷新一下。如果不如此处理,将报错

        system("mv "origin" "$0) # 执行系统内置命令system,注意空格与双引号。
        # 如果system()括号里面的参数(origin $0)加上双引号的话,那么awk就直接把引
号里面的内容回传给shell,作为shell的“命令行”,不能完成本命令功能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_36142959

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值