본문으로 건너뛰기

tar로 잘못 풀린 압축파일을 삭제하는 방법은 무엇인가요?

💡 요약 정리

  • tar 명령어로 잘못된 위치에 압축을 푼 경우 선택적으로 삭제할 수 있습니다.
  • tar tzf 명령으로 압축파일 내용을 확인하고 xargs로 삭제합니다.
  • 원본 파일을 덮어쓴 경우에도 삭제되므로 사용 시 주의가 필요합니다.
  • 백틱(`)을 사용한 명령어 치환 방식도 사용 가능합니다.

설치환경

  • CentOS 5.x (64bit)

1. tar 명령어로 잘못 풀린 압축파일 삭제하기

문제 상황

가끔 tar 명령어를 이용하여 엉뚱한 곳에서 압축파일을 잘못 풀어버리는 경우가 있습니다.

예를 들어:

  • 별도 디렉토리를 만들지 않고 현재 디렉토리에 바로 압축을 푼 경우
  • 의도하지 않은 경로에서 압축을 해제한 경우
  • 수십, 수백 개의 파일이 현재 디렉토리에 흩어진 경우

해결 방법

이럴 경우에는 tar 명령어 옵션xargs 명령어를 이용하여 압축이 풀린 파일만 선택적으로 삭제할 수 있습니다.

주의사항

원본 파일에 overwrite하여 압축을 해제한 경우에도 파일을 찾아 삭제되므로 사용에 주의가 필요합니다.


2. 실습 예제

압축 해제 전 디렉토리 상태

[root@cafe24 src]#
[root@cafe24 src]# ls
eaccelerator-0.9.6.1              mod_url-apache2                   phoronix-test-suite
eaccelerator-0.9.6.1.tar.bz2      mod_url-apache2-1.16.tar.bz2      phoronix-test-suite-4.2.0.tar.gz
epel-release-5-4.noarch.rpm       mysql-5.1.59                      php-5.2.17
freetds-0.91                      mysql-5.1.59.tar.gz               php-5.2.17.tar.gz
freetds-stable.tgz                ntfs-3g_ntfsprogs-2013.1.13       php-5.2.17_test.tar.gz
httpd-2.2.23                      ntfs-3g_ntfsprogs-2013.1.13.tgz
httpd-2.2.23.tar.gz               permision.sh
[root@cafe24 src]#

특징:

  • 깔끔하게 정리된 디렉토리 구조
  • 각 패키지별로 압축파일과 압축 해제된 디렉토리가 구분됨
  • 파일 개수가 적어 관리가 용이함

3. 잘못된 압축 해제

압축 해제 실행

현재 디렉토리에서 별도의 디렉토리 생성 없이 바로 압축을 해제:

[root@cafe24 src]# tar xzf php-5.2.17_test.tar.gz

압축 해제 후 디렉토리 상태

[root@cafe24 src]# ls
acconfig.h                      makedist                          README.QNX
acconfig.h.in                   Makefile.frag                     README.SELF-CONTAINED-EXTENSIONS
acinclude.m4                    Makefile.gcov                     README.STREAMS
aclocal.m4                      Makefile.global                   README.SUBMITTING_PATCH
build                           makerpm                           README.SVN-RULES
buildconf                       missing                           README.TESTING
buildconf.bat                   mkinstalldirs                     README.TESTING2
CODING_STANDARDS                mod_url-apache2                   README.UNIX-BUILD-SYSTEM
config.guess                    mod_url-apache2-1.16.tar.bz2      README.UPDATE_5_2
config.sub                      mysql-5.1.59                      README.WIN32-BUILD-SYSTEM
configure                       mysql-5.1.59.tar.gz               README.Zeus
configure.in                    netware                           regex
CREDITS                         NEWS                              run-tests.php
eaccelerator-0.9.6.1            ntfs-3g_ntfsprogs-2013.1.13       sapi
eaccelerator-0.9.6.1.tar.bz2    ntfs-3g_ntfsprogs-2013.1.13.tgz   scripts
epel-release-5-4.noarch.rpm     pear                              server-tests-config.php
ext                             permision.sh                      server-tests.php
EXTENSIONS                      phoronix-test-suite               snapshot
footer                          phoronix-test-suite-4.2.0.tar.gz  stamp-h.in
freetds-0.91                    php-5.2.17                        stub.c
freetds-stable.tgz              php-5.2.17.tar.gz                 svnclean.bat
generated_lists                 php-5.2.17_test.tar.gz            tests
genfiles                        php5.spec.in                      TODO
header                          php.gif                           TODO-5.1
httpd-2.2.23                    php.ini-dist                      TODO-PHP5
httpd-2.2.23.tar.gz             php.ini-recommended               TSRM
INSTALL                         README.EXTENSIONS                 UPGRADING
install-sh                      README.EXT_SKEL                   vcsclean
LICENSE                         README.input_filter               win32
ltmain.sh                       README.PARAMETER_PARSING_API      Zend
main                            README.PHP4-TO-PHP5-THIN-CHANGES
[root@cafe24 src]#

문제점:

  • 압축파일 내의 모든 파일이 현재 디렉토리에 직접 풀림
  • 기존 파일들과 섞여서 구분이 어려움
  • 수십 개의 파일이 뒤섞여 관리 곤란
  • 어떤 파일이 압축에서 나온 것인지 파악 어려움

4. 해결 방법 1: tar tzf + xargs 사용

명령어

[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | xargs rm -rf

명령어 구성 요소

tar tzf

  • t: 압축파일의 내용 목록 출력 (list)
  • z: gzip 압축 해제
  • f: 파일 지정

| (파이프)

  • 앞 명령의 출력을 뒤 명령의 입력으로 전달

xargs rm -rf

  • xargs: 표준 입력을 명령행 인자로 변환
  • rm -rf: 파일/디렉토리 강제 삭제

실행 결과

[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | xargs rm -rf
[root@cafe24 src]# ls
eaccelerator-0.9.6.1              mod_url-apache2                   phoronix-test-suite
eaccelerator-0.9.6.1.tar.bz2      mod_url-apache2-1.16.tar.bz2      phoronix-test-suite-4.2.0.tar.gz
epel-release-5-4.noarch.rpm       mysql-5.1.59                      php-5.2.17
freetds-0.91                      mysql-5.1.59.tar.gz               php-5.2.17.tar.gz
freetds-stable.tgz                ntfs-3g_ntfsprogs-2013.1.13       php-5.2.17_test.tar.gz
httpd-2.2.23                      ntfs-3g_ntfsprogs-2013.1.13.tgz
httpd-2.2.23.tar.gz               permision.sh
[root@cafe24 src]#

결과:

  • 압축에서 풀린 파일들만 선택적으로 삭제됨
  • 원래 있던 파일들은 그대로 유지됨
  • 디렉토리가 깔끔하게 복원됨

5. 해결 방법 2: 백틱(`) 사용

명령어

[root@cafe24 ~]# rm -rf `tar tzf php-5.2.17_test.tar.gz`

실행 결과

[root@cafe24 src]# ls
eaccelerator-0.9.6.1              mod_url-apache2                   phoronix-test-suite
eaccelerator-0.9.6.1.tar.bz2      mod_url-apache2-1.16.tar.bz2      phoronix-test-suite-4.2.0.tar.gz
epel-release-5-4.noarch.rpm       mysql-5.1.59                      php-5.2.17
freetds-0.91                      mysql-5.1.59.tar.gz               php-5.2.17.tar.gz
freetds-stable.tgz                ntfs-3g_ntfsprogs-2013.1.13       php-5.2.17_test.tar.gz
httpd-2.2.23                      ntfs-3g_ntfsprogs-2013.1.13.tgz
httpd-2.2.23.tar.gz               permision.sh
[root@cafe24 src]#

백틱(`) vs $()

백틱 방식:

rm -rf `tar tzf file.tar.gz`

$() 방식 (권장):

rm -rf $(tar tzf file.tar.gz)

차이점:

  • $(): 중첩 사용 가능, 가독성 좋음 (Bash 권장)
  • 백틱: 전통적 방식, 중첩 시 이스케이프 필요

6. 압축 형식별 명령어

tar.gz / tgz

tar tzf file.tar.gz | xargs rm -rf

tar.bz2 / tbz

tar tjf file.tar.bz2 | xargs rm -rf

tar.xz

tar tJf file.tar.xz | xargs rm -rf

tar (압축 없음)

tar tf file.tar | xargs rm -rf

7. 안전한 사용 방법

1단계: 압축파일 내용 미리 확인

삭제하기 전에 어떤 파일이 포함되어 있는지 확인:

[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | head -20
php-5.2.17/
php-5.2.17/TSRM/
php-5.2.17/TSRM/tsrm_config.w32.h
php-5.2.17/TSRM/TSRM.c
php-5.2.17/TSRM/tsrm_virtual_cwd.c
php-5.2.17/TSRM/tsrm_virtual_cwd.h
php-5.2.17/TSRM/tsrm_config_common.h
php-5.2.17/TSRM/tsrm_strtok_r.c
php-5.2.17/TSRM/tsrm_win32.c
php-5.2.17/TSRM/tsrm_win32.h
php-5.2.17/TSRM/TSRM.h
php-5.2.17/TSRM/threads.m4
php-5.2.17/TSRM/acinclude.m4
php-5.2.17/TSRM/tsrm_nw.c
php-5.2.17/TSRM/tsrm_nw.h
php-5.2.17/TSRM/README
php-5.2.17/TSRM/Makefile.am
php-5.2.17/TSRM/Makefile.frag
php-5.2.17/TSRM/LICENSE
php-5.2.17/main/

2단계: 파일 개수 확인

[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | wc -l
3456

3단계: 삭제 전 백업 (중요한 경우)

[root@cafe24 src]# tar czf backup_$(date +%Y%m%d).tar.gz *

4단계: dry-run 테스트

실제로 삭제하지 않고 삭제될 파일 목록만 확인:

[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | xargs -p rm -rf

-p 옵션: 각 파일 삭제 전에 확인 프롬프트 표시


8. 주의사항

원본 파일 덮어쓰기 문제

위험 시나리오:

  1. 이미 php-5.2.17 디렉토리가 존재
  2. php-5.2.17_test.tar.gz 압축 해제
  3. 기존 파일이 덮어써짐
  4. tar tzf | xargs rm -rf 실행
  5. 원본 파일도 함께 삭제됨

해결 방법:

압축 해제 전 항상 디렉토리 생성:

[root@cafe24 src]# mkdir temp_extract
[root@cafe24 src]# cd temp_extract
[root@cafe24 temp_extract]# tar xzf ../php-5.2.17_test.tar.gz

파일명에 공백이 포함된 경우

문제:

파일명에 공백이 있으면 xargs가 잘못 처리할 수 있음

해결:

tar tzf file.tar.gz | xargs -d '\n' rm -rf

또는:

tar tzf file.tar.gz | while read file; do rm -rf "$file"; done

심볼릭 링크 주의

압축파일에 심볼릭 링크가 포함된 경우:

  • 링크 대상까지 삭제될 수 있음
  • 사전에 tar tzf로 확인 필요

9. 예방 방법

압축 해제 전 항상 별도 디렉토리 생성

좋은 습관:

# 1. 별도 디렉토리 생성
[root@cafe24 src]# mkdir php-5.2.17-test

# 2. 디렉토리로 이동
[root@cafe24 src]# cd php-5.2.17-test

# 3. 압축 해제
[root@cafe24 php-5.2.17-test]# tar xzf ../php-5.2.17_test.tar.gz

# 4. 내용 확인
[root@cafe24 php-5.2.17-test]# ls

압축 해제 전 내용 확인

# 압축파일 최상위 구조 확인
[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | head -10

# 최상위 디렉토리가 있는지 확인
[root@cafe24 src]# tar tzf php-5.2.17_test.tar.gz | head -1

판단 기준:

  • php-5.2.17/로 시작 → 안전 (별도 디렉토리 생성됨)
  • README 등으로 시작 → 위험 (현재 디렉토리에 바로 풀림)

--one-top-level 옵션 사용 (tar 1.28+)

[root@cafe24 src]# tar xzf php-5.2.17_test.tar.gz --one-top-level

자동으로 최상위 디렉토리를 생성하여 압축 해제


10. 관련 명령어

tar 옵션

옵션설명
t압축파일 내용 목록 출력
x압축 해제 (extract)
c압축 생성 (create)
zgzip 압축/해제
jbzip2 압축/해제
Jxz 압축/해제
f파일 지정
v상세 출력 (verbose)

xargs 옵션

옵션설명
-p실행 전 확인 프롬프트
-n한 번에 처리할 인자 개수
-d구분자 지정
-I치환 문자열 지정

11. 실전 예제

예제 1: 여러 개의 압축파일 정리

# 잘못 풀린 여러 압축파일 한 번에 정리
for file in *.tar.gz; do
    echo "Cleaning up $file"
    tar tzf "$file" | xargs rm -rf
done

예제 2: 특정 확장자만 삭제

# 압축에서 나온 .c 파일만 삭제
tar tzf php-5.2.17_test.tar.gz | grep '\.c$' | xargs rm -f

예제 3: 디렉토리만 삭제

# 압축에서 나온 디렉토리만 삭제 (파일은 유지)
tar tzf php-5.2.17_test.tar.gz | grep '/$' | xargs rm -rf

12. 문제 해결

"Argument list too long" 오류

원인: 파일 개수가 너무 많아 명령행 길이 초과

해결 방법:

# xargs를 이용한 배치 처리
tar tzf file.tar.gz | xargs -n 100 rm -rf

권한 부족 오류

원인: 일부 파일에 대한 삭제 권한 없음

해결 방법:

# sudo 사용
tar tzf file.tar.gz | xargs sudo rm -rf

# 또는 권한 변경 후 삭제
tar tzf file.tar.gz | xargs chmod -R 755
tar tzf file.tar.gz | xargs rm -rf

참고사항

  • 이 방법은 CentOS 5.x 기준이지만 대부분의 리눅스 배포판에서 동일하게 작동합니다.
  • 압축 해제 전 항상 tar tzf 명령으로 내용을 확인하는 습관을 들이세요.
  • 중요한 파일이 포함된 디렉토리에서는 반드시 백업 후 작업하세요.
  • 원본 파일을 덮어쓴 경우 복구가 불가능하므로 각별히 주의하세요.

참고 자료