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