专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
51好读  ›  专栏  ›  嵌入式微处理器

如何高效批量修改文件?一招搞定!

嵌入式微处理器  · 公众号  ·  · 2024-06-25 17:24

正文

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"。

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命令将原始文件重命名为新的文件名。

END

来源:IC芯视界

版权归原作者所有,如有侵权,请联系删除






请到「今天看啥」查看全文