shell脚本批量改名
#!/bin/bash # 检查输入参数是否正确 if [ "$#" -lt 3 ]; then echo "Usage: $0 <root_directory> <old_string> <replace_string> [1]" exit 1 fi root_directory=$1 old_string=$2 replace_string=$3 confirm_flag=${4:-"0"} #echo $confirm_flag # 默认情况下不进行确认 confirm_replace=false # 检查第四个参数是否为"1",如果是,则设置为true if [ "$confirm_flag" == "1" ]; then confirm_replace=true fi # 确保输入的路径是绝对路径 root_directory=$(cd "$root_directory"; pwd) echo "root_directory: ${root_directory}" for file in "$root_directory"/* do # 使用sed命令替换文件名中的特定字符串 # 使用basename命令获取不包含路径的文件名 newname=$(basename "$file" | sed "s/$old_string/$replace_string/") # 检查新文件名是否与原文件名不同,如果是则重命名 if [ "$newname" != "$(basename "$file")" ]; then echo "$file => $root_directory/$newname" if $confirm_replace; then mv "$file" "$root_directory/$newname" #echo "执行替换了" fi fi done
./rename_files.sh 目录 原字符串 替换后的字符串 1
2.使用xargs, 给每个文件名字前面增加abc
ls | xargs -I {} mv {} abc{}
解释:
ls
:列出当前目录下的所有文件。|
:管道符号,将左边命令的输出作为右边命令的输入。xargs -I {}
:使用xargs
读取输入的数据,并用{}
作为占位符替换。mv {} abc{}
:将每个文件名替换为abc
加上原来的文件名。
这个命令会将当前目录下的所有文件名前面添加"abc"前缀。
注意:这个方法假设您当前目录下没有子目录。如果有子目录,ls
命令会列出子目录的名称,这可能导致错误。为了避免这个问题,您可以使用find
命令结合xargs
:
find . -maxdepth 1 -type f -print0 | xargs -0 -I {} mv {} abc{}
3.
如果你想使用xargs
将每个文件名中的"abc"替换为"ef",你可以这样做:
ls | grep 'abc' | xargs -I {} bash -c 'mv "$1" "${1//abc/ef}"' _ {}
解释:
ls
:列出当前目录下的所有文件。grep 'abc'
:过滤出包含"abc"的文件名。xargs -I {}
:使用xargs
读取输入的数据,并用{}
作为占位符替换。bash -c 'mv "$1" "${1//abc/ef}"' _ {}
:对于每个文件名,执行一个bash命令,将"abc"替换为"ef"。
这个命令会将当前目录下的所有文件名中的"abc"替换为"ef"。
注意:这个方法假设您当前目录下没有子目录。如果有子目录,ls
命令会列出子目录的名称,这可能导致错误。为了避免这个问题,您可以使用find
命令结合xargs
:
find . -maxdepth 1 -type f -name '*abc*' -print0 | xargs -0 -I {} bash -c 'mv "$1" "${1//abc/ef}"' _ {}
解释:
find . -maxdepth 1 -type f -name '*abc*'
:查找当前目录下的所有文件(不包括子目录),并且文件名中包含"abc"。-print0
:使用空字符(null)作为文件名之间的分隔符。-xargs -0
:告诉xargs
使用空字符(null)作为输入数据的分隔符。
这个命令会更安全地处理包含子目录的情况。
4.shell脚本 批量修改文件名, 遍历文件夹中的*.zip, 修改文件名, 替换文件名中的abc为test, 替换dda为s5
#!/bin/bash # 遍历当前目录下所有的.zip文件 for file in *.zip; do # 检查文件是否存在,避免空循环 if [ -f "$file" ]; then # 使用sed命令替换文件名中的特定字符串 # 使用basename命令获取不包含路径的文件名 newname=$(basename "$file" | sed 's/abc/test/g' | sed 's/dda/s5/g') # 检查新文件名是否与原文件名不同,如果是则重命名 if [ "$newname" != "$(basename "$file")" ]; then mv "$file" "$newname" fi fi done echo "批量重命名完成。"
这个脚本做了以下几件事:
- 使用
for
循环遍历当前目录下所有以.zip
结尾的文件。 - 对于每个文件,使用
basename
命令获取其文件名(不包含路径)。 - 使用
sed
命令两次,分别将文件名中的abc
替换为test
,将dda
替换为s5
。 - 检查生成的新文件名是否与原文件名不同,如果是,则使用
mv
命令重命名文件。 - 打印完成消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2023-08-27 cocos creator使用用vscode调试
2014-08-27 Release时error c1083 无法打开包括文件
2014-08-27 HEAP CORRUPTION 错误