UNIX를 통해 tar 파일에 존재하는 파일 문자열을 바꾸는 방법

UNIX를 통해 tar 파일에 존재하는 파일 문자열을 바꾸는 방법

많은 .sh 파일을 포함하는 tar 아카이브 xyz.tar가 있습니다. 예를 들면 다음과 같습니다.

123.sh
456.sh
789.sh

각 파일에는 Welcome to Hollywood, I Love Hollywood, Hollywood Movies .sh등의 문자열 콘텐츠가 포함되어 있습니다 .123.sh456.sh789.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

관련 정보