棋子 · 6月17日

linux 命令:高效批量修改文件如此简单

1.批量修改文件内容

find . -type f  -exec sed -i 's/oldname/newname/g' {} +

此命令含义:在当前目录及其所有子目录中查找所有文件,并对这些文件执行 sed 命令,将文件内容中的所有 oldname 字符串替换为 newname。

- find .:从当前目录(.)开始查找文件。

- -type f:指定查找的类型为文件(file),这意味着 find 将仅查找文件,不包括目录。

- -exec:对找到的每个文件执行后面的命令。

- sed -i 's/oldname/newname/g':这是要执行的命令。sed 是一个流编辑器,用于对文本进行处理。

-sed:调用流编辑器程序。

--i:表示直接修改文件内容。

-'s/oldname/newname/g':sed 的命令,用于替换文本。

-s:表示替换操作。

-oldname:被替换的源字符串。

-newname:替换的目标字符串。

-g:全局标志,表示替换所有匹配的实例,而不是仅替换每行的第一个实例。

-{}:是一个占位符,代表 find 命令找到的文件名。

- +:表示 find 命令将所有匹配的文件名作为列表传递给 -exec 指定的命令,而不是一次传递一个文件名。这种方式可以提高执行效率,因为它减少了 sed 命令的调用次数。

2.批量修改文件名称

将如下代码写入rename.sh文件中,在ternimal中执行 sh rename.sh

在当前目录及其所有子目录下查找所有文件名中包含"tmp"的文件,并将这些文件的文件名中的"tmp"替换为"xxx"。

image.png


find . -type f -name '*tmp*' -exec sh -c '
    file="$1"
    dir="$(dirname "$file")"
    base=$(basename "$file")
    # 只替换文件名中的tmp为xxx
    echo $base
    newbase="${base//tmp/xxx}"
    echo $newbase
    if [ "$base" != "$newbase" ]; then
        newfile="$dir/$newbase"
        mv "$file" "$newfile"
    fi
' _ {} \;

1. find .:这个命令用来查找当前目录(.)及其子目录下的所有文件和目录。

2. -type f:这个选项指定find命令只查找文件类型的项。

3. -name '*tmp*':这个选项用来匹配文件名中包含"tmp"字符串的文件。

4. -exec sh -c '...' _ {} \;:这个选项允许对匹配到的每个文件执行指定的shell命令。这里的sh -c是执行一段shell脚本。脚本中:

-file="$1":将find命令传递给脚本的第一个参数(即当前匹配到的文件路径)赋值给变量file。    

-dir="$(dirname "$file")":使用dirname命令获取文件所在的目录路径,并赋值给变量dir。

-base=$(basename "$file"):使用basename命令获取文件名,并赋值给变量base。

-echo $base:打印原始文件名。

-newbase="${base//tmp/xxx}":使用bash的字符串替换功能,将文件名中的"tmp"替换为"xxx",并将结果赋值给变量newbase。

-echo $newbase:打印替换后的文件名。

-if [ "$base" != "$newbase" ]; then ... fi:如果原始文件名和替换后的文件名不同,执行下面的命令。

-newfile="$dir/$newbase":构造新的文件路径。

-mv "$file" "$newfile":使用mv命令将原始文件重命名为新的文件名。

作者:IC小鸽
文章来源:IC芯视界

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
20180
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息