复制代码
#!/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