Linux 替换文件名和内容:shell脚本

Linux 替换文件名和内容:shell脚本,linux,shell,Linux,Shell,我已经编写了替换内容的代码,但是与替换文件名非常混淆,两者都在同一个脚本中。我希望脚本按以下方式运行: suppose I give input : ./myscript.sh abc xyz abc is my string to be replaced xyz is the string to replace with 如果某个目录或其中的任何子目录或文件的名称为abc,则该名称也应更改为xyz 这是我的密码: filepath="/misc/home3/babitasandooja/

我已经编写了替换内容的代码,但是与替换文件名非常混淆,两者都在同一个脚本中。我希望脚本按以下方式运行:

suppose I give input : ./myscript.sh abc xyz

abc is my string to be replaced 
xyz is the string to replace with
如果某个目录或其中的任何子目录或文件的名称为abc,则该名称也应更改为xyz

这是我的密码:

filepath="/misc/home3/babitasandooja/fol1"
for file in $(grep -lR $1 $filepath)
do
sed  -i "s/$1/$2/g" $file
echo "Modified: " $file
done
现在,我应该如何编写代码来替换文件名

我试过:

if( *$1*==$file )
then  
rename $1 $2 $filepath
fi

但这些都不能正常工作。我该怎么办?我应该采取哪种方法

任何帮助都将不胜感激。 谢谢:)

注意:
rename
也会重命名目录部分

  • grep-Z
    使其产生空分隔的输出。i、 e.它生成由文件名组成的输出,其中所有内容都由
    0x00
    分隔
  • -d'
    使
    读取
    读取输入以
    0x00
    分隔<代码>-r防止 要解释的反斜杠;和
    IFS=
    防止使用
    IFS
    进行分词
  • IFS=read-rd'
    使用分隔符“0”进行读输入
  • base=${file##*/}
    删除目录部分。它与base=$(basename“$file”)相同
  • dir=${file%/*}
    删除文件部分
  • [[$base==*“$str”*]
    检查文件名是否有可以重命名的内容<代码>&&如果前一个返回零(真)代码,则执行它后面的命令。将其视为单个链接
    if
    语句
  • “$dir/${base//$str/$rep}”
    形成新的文件名
    ${base//$str/$rep}
    替换
    $base
    中与
    $str
    值匹配的任何内容,并将其替换为
    $rep

非常感谢。。很好用。请您解释一下,因为我对shell脚本还不熟悉。再次感谢…:)但是如果我的目录名为abc,它将被xyz取代。但如果是abc.txt,则不是。我需要做什么更改???@user3542109我想您可以使用
rename
,但这将更加复杂,因为您还必须手动创建目录。我想我误解了你的问题,所以我只想通过:)我希望它对你有帮助。
find -iname $filepath -exec mv $1 $2 \;
#!/bin/bash
dir=$1 str=$2 rep=$3
while IFS= read -rd '' file; do
    sed  -i "s/$str/$rep/g" -- "$file"
    base=${file##*/} dir=${file%/*}
    [[ $base == *"$str"* ]] && mv "$file" "$dir/${base//$str/$rep}"
done < <(exec grep -ZFlR "$str" "$dir")
bash script.sh dir string replacement