나는 다음과 같은 상황을 처리하려고 노력하고 있습니다. 폴더 트리에 확장자를 가진 많은 파일(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
and를 사용하여 문자열을 바꾸는 방법을 알고 있습니다 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