我正在嘗試處理以下情況。我在資料夾樹中有許多帶有擴展名的檔案(超過 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