많은 .sh 파일을 포함하는 tar 아카이브 xyz.tar가 있습니다. 예를 들면 다음과 같습니다.
123.sh
456.sh
789.sh
각 파일에는 Welcome to Hollywood, I Love Hollywood, Hollywood Movies .sh
등의 문자열 콘텐츠가 포함되어 있습니다 .123.sh
456.sh
789.sh
.sh
이제 내 목표는 루프를 사용하여 모든 파일에서 Hollywood 문자열을 Oscar로 바꾸는 것입니다.
나는 다음 명령을 시도했습니다.
for i in $(tar -xvf xyz.tar); do sed -e 's/Hollywood/Oscar/' $i; done
명령 창에 출력이 표시되지만 추출 및 교체 명령 후에 tar 아카이브를 다시 압축할 수 없기 때문에 o/p가 xyz.tar 아카이브에 반영되지 않습니다.
답변1
먼저, .tar 파일은 일반적으로 압축되지 않는다는 점을 알아야 합니다(만일 압축된 경우 .tar.gz
확장자는 .일 가능성이 높습니다 .tar.xz
).
그런 다음 tar -xvf xyz.tar
파일을 추출합니다.그리고이름 나열, sed는 파일 내용이 아닌 파일 이름 목록에 대해 작동합니다.
대체 길이가 원본 파일과 정확히 동일하면 이론적으로는 (tar 파일에 체크섬이 없으므로) 대체할 수 있습니다 .tar
. 그러나 더 나은 접근 방식은 먼저 임시 디렉토리의 모든 파일을 추출한 다음 다음을 사용하는 것입니다.
find . -name "*.sh" -print0 | xargs -0 sed -i -e 's/Hollywood/Oscar/'
그런 다음 임시 디렉터리에서 tar 파일을 다시 만듭니다.
이는 입력 파일을 편집된 내용으로 대체하는 sed
것을 지원한다고 가정합니다 -i
. 그렇지 않은 경우 출력을 호출하여 임시 파일에 쓴 다음 sed
완료되면 파일을 다시 복사하는 작은 스크립트를 만들어야 합니다.sed