디렉터리 트리(../MyParentFolder) 내의 특정 파일 확장자("*.txt") 내에서 문자열("AAA")을 찾아 하위 폴더 이름(MySubfolder)으로 바꾸고 싶습니다. 누군가 비슷한 질문을 한 것으로 알고 있습니다.여기하지만 하위 폴더 이름을 바꾸려면 이동할 수 없습니다.
답변1
세 번째 예 사용( exec
)수락된 답변도착하다특정 파일 확장자에 대한 문자열 검색 및 바꾸기:
find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +
먼저 설정은 $replace
다음과 같습니다.
replace='s/AAA/MySubfolder/'
find
그런 다음 명령을 실행하십시오 .
export
replace
참고: 시작해야 할 수도 있습니다.다른명령 처리 사용 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
할 파일 이름에서 폴더 이름을 추출합니다 .AAA
perl
i
AAA
1
따라서 in 및 in AAA
으로 대체됩니다 .MySubfolder
../MySubfolder/a.txt
foo
../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
도 지원하므로 여기에서 간단히 대체하여 이를 사용할 수 있습니다.perl
perl
grep -rlZ --include='*.txt' AAA ../MySubfolder |
xargs -r0 sed -i 's/AAA/MySubfolder/g'