次の状況を処理しようとしています。フォルダツリーに拡張子を持つ多くのファイル(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