私は次のような状況に対処しようとしています。フォルダー ツリーに拡張子を持つファイルが多数 (100 個以上) あり.html
、それらのファイル内にはファイル名である文字列があります。たとえば、次のファイルがあります。
file1.html
subfolder1/subfolderA/
ファイル内のどこかに文字列 が含まれていますfile1.html
。
file2.html
subfolder1/subfolderB/
ファイル内のどこかに文字列が含まれているfile2.html
file3.html
subfolder2/subfolderC/
ファイル内のどこかに文字列 が含まれていますfile3.html
。
等々。
基本的には、ツリー構造全体を調べて、ファイル名と同じ文字列を見つけ、それをパス + ファイル名に置き換えて、.html
.
したがって、上記の例では、次のものを置き換えます。
ファイル内
file1.html
:file1.html
と置換するsubfolder1/subfolderA/file1
で
file2.html
:file2.html
と置換するsubfolder1/subfolderB/file2
file3.html 内:
file3.html
と置換するsubfolder2/subfolderC/file3
find
およびを使用して文字列を置換する方法は知っていますsed
。次のコマンドを使用しました。
find . -type f -name \*.html -exec sed -i.bak 's|<old string>|<new string>|g' {} +
ただし、その場合、「古い文字列」と「新しい文字列」をハードコードする必要があります。
上記を実現するにはどうすればいいでしょうか
「古い文字列」 = ファイル名 + ファイル拡張子
「新しい文字列」 = パス + ファイル名 - ファイル拡張子
どのような助けでも大歓迎です。
答え1
残念ながら、 と だけでは指定した操作は実行できませんfind
。exec
のfind
結果を小さなwhile
ループにパイプしてみてください。
find . -type f -name \*.html | while read PN; do sed "s|${PN##*/}|${PN%.*}|g" "$PN"; done
答え2
テスト済み、問題なく動作しました
#!/bin/bash
echo "enter the input"
read p
cd $p
echo "enter the file"
read f
if [[ -f $p/$f ]]
then
echo "file exsists"
grep -io "$f" $p/$f >/dev/null
if [[ $? == 0 ]]
then
r=`echo $f | sed "s/\.txt//g"`
echo $r
awk -v f="$f" -v r="$r" '{gsub(f,r,$0);print }' $f
fi
fi