linux - 如何在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
解决方案
可以使用 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 和重命名的手册页
推荐阅读
- reactjs - 使用 webpack 5 热重新加载对我的反应项目不起作用
- aiml - Callapi和openweathermap
- sql - SQL Join 以获取最小行
- python-3.x - 如何在 python 中为 aws dynamodb 创建常量对象?
- android - 有什么方法可以通过使用 OkHttp3 来防止 SSL Pinning Bypass?
- youtube - 为什么 youtube-dl 开始给出这个错误信息 - YouTube 说:无法提取视频数据
- fortran - 类型绑定赋值将成员重新初始化为零
- javascript - 如何从Javascript数组中获取顺序元素?
- python-3.x - 根据另一个复选框的选定值更新复选框
- node.js - 我想在 mongodb 中更新多文档