특정 파일 확장자에서 문자열을 검색하여 폴더 이름으로 바꿉니다.

특정 파일 확장자에서 문자열을 검색하여 폴더 이름으로 바꿉니다.

디렉터리 트리(../MyParentFolder) 내의 특정 파일 확장자("*.txt") 내에서 문자열("AAA")을 찾아 하위 폴더 이름(MySubfolder)으로 바꾸고 싶습니다. 누군가 비슷한 질문을 한 것으로 알고 있습니다.여기하지만 하위 폴더 이름을 바꾸려면 이동할 수 없습니다.

답변1

세 번째 예 사용( exec)수락된 답변도착하다특정 파일 확장자에 대한 문자열 검색 및 바꾸기:

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

먼저 설정은 $replace다음과 같습니다.

replace='s/AAA/MySubfolder/'

find그런 다음 명령을 실행하십시오 .


exportreplace참고: 시작해야 할 수도 있습니다.다른명령 처리 사용 find:

export replace='s/AAA/MySubfolder/'

또한 "AAA"가 한 줄에 여러 번 나타나고 이를 모두 바꾸려면 다음을 수행해야 합니다.글로벌,이와 같이

s/AAA/MySubfolder/g

답변2

GNU grep또는 호환 버전을 사용하면 다음을 수행할 수 있습니다.

grep -rlZ --include='*.txt' AAA ../MySubfolder |
   perl -MFile::Basename -pi -e '
     BEGIN {local $/ = "\0"; @ARGV = <STDIN>}
     if ($. == 1) {
       $replacement = basename dirname $ARGV;
     }
     s/AAA/$replacement/g;
     close ARGV if eof' ''

여기서는 n번 편집된 파일이 한 번 이상 포함된 파일을 grep찾고 , 각 파일의 첫 번째 줄을 읽을 때 대체 txt할 파일 이름에서 폴더 이름을 추출합니다 .AAAperliAAA1

따라서 in 및 in AAA으로 대체됩니다 .MySubfolder../MySubfolder/a.txtfoo../MySubfolder/foo/b.txt

항상 AAA으로 바꾸려면 다음을 수행하십시오.MySubfolder

grep -rlZ --include='*.txt' AAA ../MySubfolder |
  xargs -r0 perl -pi -e 's/AAA/MySubfolder/g'

(GNU xargs또는 호환 가정).

GNU는 sed또한 내부 편집 기능 -i도 지원하므로 여기에서 간단히 대체하여 이를 사용할 수 있습니다.perlperl

grep -rlZ --include='*.txt' AAA ../MySubfolder |
  xargs -r0 sed -i 's/AAA/MySubfolder/g'

관련 정보