首页 > 解决方案 > 如何在linux中使用bash shell脚本递归地重命名文件中的所有目录、文件和文本

问题描述

我已经重命名了文件中的所有文件和文本,并且还应该将目录重命名为最深的级别,并且必须递归地完成我尝试了以下两个代码:

代码 :

#!/bin/bash
cd /home/my_codes/vehicle

echo "enter the old name: "
read old_name
echo "enter the new name: "
read new_name
    echo "you entered $old_name and $new_name "

if [[ $old_name -eq $new_name ]]; then 
 #i have tried with "$old_name" == "$new_name" but no use
   echo "redeclaration error"
else
echo "process started"
for f in *;
do
sed -i 's/$old_name/$new_name/' "$f"
if cmp -s -- "$f" $old_name*.txt; then
        mv "$f" "${f/$old_name/$new_name}"
fi 
done
fi

即使我给它起不同的名称,代码也总是返回重新声明错误。该功能在没有第一个 if 条件的情况下工作正常,但我只是添加了参数和重新声明错误来检查它。

编辑:我尝试过使用以下递归代码,但无法做到。请让我知道我可以在相同的代码中进行哪些更改以获得所需的输出。

#!/bin/bash
rnrr() {
   
      echo "processing"
      echo $old_name
      echo $new_name
    for f in *;
    do
        if [ -d "$f" ]; then
           mv  "$f" "${f/$old_name/$new_name}"
           echo $f
           rnrr "$f"/*
     else 
           sed -i "s/$old_name/$new_name/" "$f"
                if cmp -s -- "$f" $old_name.*; then
                           mv "$f" "${f/$old_name/$new_name}"
            fi
            
         fi
     shift
     done


}
echo " current directory :"
currdir=$(pwd)
echo $currdir   
echo "enter the diretory path(absolute):"
read path
cd $path

echo "current directory :"
echo $(pwd)
echo "enter the old name :"
read old_name    
echo "enter the new name :"
read new_name
echo "process started.."

rnrr 

标签: linuxbashshellscripting

解决方案


可以使用 find sed 和 rename 命令轻松实现 首先让我们使用以下命令将所有 txt/.c 文件内容中的所有车辆替换为 car,该命令使用 sed 替换

find -name vehicle.txt -exec sed -i "s:vehicle:car:g" {} \;

现在让我们使用以下命令重命名文件和文件夹名称

find -depth -name "vehicle*" -exec rename "s/(.*)vehicle/\1car/" {} +

请注意,我在最终命令中添加了 -depth 以确保首先重命名最深的文件夹/文件。有关更多信息,请参阅查找、sed 和重命名的手册页


推荐阅读