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命令将原始文件重命名为新的文件名。
作者:IC小鸽
文章来源:IC芯视界
推荐阅读
更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。