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

时间:2014-08-04 08:05:59

标签: 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/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

find -iname $filepath -exec mv $1 $2 \;

但是其中任何一个都无法正常工作。我该怎么办?我应该采取哪种方法?

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

1 个答案:

答案 0 :(得分:0)

#!/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

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

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