다음 상황을 처리하려고 합니다. 폴더 트리에 확장자를 가진 많은 파일(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