我已经编写了替换内容的代码,但是在同一个脚本中都替换了文件名。我希望我的脚本以这种方式运行:
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 \;
但是其中任何一个都无法正常工作。我该怎么办?我应该采取哪种方法?
任何帮助将不胜感激。 谢谢:)
答案 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
的值。