반응형


기본 압축 명령어 사용법

gzip, gunzip 을 사용한다.

gzip, gunzip 커맨드는 기본적으로 개별 파일 단위로 압축 / 해제를 진행하며, 압축 / 해제 진행시 원래 파일은 삭제된다. 압축시에는 원래 파일명에 .gz 확장자가 추가된 파일이 생성된다.

 

 

@ 압축하기

> gzip test.txt

 

위의 명령어가 실행되고 나면, test.txt.gz 파일이 생성되며, test.txt 파일은 삭제된다.

 

 

@ 압축 해제

> gunzip test.txt.gz

 

압축 해제시에도 마찬가지로 test.txt 파일이 생성되며, test.txt.gz 파일은 삭제된다.

 

압축 해제는 gzip의 -d 옵션으로도 가능하다. (decompress)

> gzip -d test.txt.gz

 


@ 압축 / 해제 후 원래 파일을 유지하기

-k 옵션을 사용하면 된다. (keep)

 

> gzip -k test.txt

 

 

@ 여러 파일을 동시에 압축하기

파일명을 차례대로 적어 주면 된다.

> gzip a.txt b.txt c.txt

 

혹은 

> gzip *.txt

 

실행후에는 a.txt.gz, b.txt.gz, c.txt.gz 의 형태로, 개별 파일이 생성된다. 그리고 원래 파일인 a.txt, b.txt, c.txt 파일은 삭제가 된다.

 

 

pigz 명령어 사용법

여러 파일을 압축해야 한다면, 멀티 코어 CPU를 지원하는 pigz를 사용하면 더 빠른게 압축이 진행된다.

아래 링크에서 배포하고 있으며, 최신 리눅스에서는 apt나 yum으로 설치가 가능하다.

http://zlib.net/pigz/

 

기본 동작 방식이나 옵션은 gzip, gunzip 과 매우 유사하다. 

> pigz *.txt

 

위의 명령어가 실행되면 .txt.gz 파일들이 생성되고, 원본 txt 파일들은 삭제된다.

 

압축해제

> pigz -d *.txt.gz

 

 

tar 명령어 사용법

여러 파일들을 하나의 파일로 묶어줄 때는 tar 명령어를 사용한다.

 

@ tar 명령어를 이용해서 하나의 파일로 묶기

> tar -cvf all.tar *.txt

 

위의 명령어를 실행하면, all.tar 파일이 생성되며, 원래 txt 파일들은 삭제되지 않는다.

 

 

@ tar 명령어를 이용해서 묶인 파일을 해제하기

> tar -xvf all.tar

 

위의 명령어를 실행하면 all.tar 파일에 묶여 있던 txt 파일들이 생성되며, all.tar 파일은 삭제되지 않는다. 

 

묶을 때는 c 옵션, 해제할 때는 x 옵션

-v 옵션은 verbose를 의미하며, 압축 / 해제되는 파일을 화면에 표시되게 해준다.

-f 옵션은 파일명을 지정할 때 사용한다.

 

 

@ 하나의 파일로 묶으면서 gzip으로 압축하기

-z 옵션을 추가한다.

> tar -czvf all.tar.gz *.txt

 

 

@ 하나의 파일로 묶으면서 bzip2로 압축하기

-j 옵션을 추가한다.

> tar -cjvf all.tar.bz2 .

 

 

@ 압축된 tar 파일 해제하기

> tar -xvf all.tar.gz
> tar -xvf all.tar.bz2

 

 

 

cf. all.tar.gz 파일을 gzip (혹은 gunzip)으로 압축 해제하면, all.tar 파일이 생성된다. gzip (혹은 gunzip)으로 압축 해제해서 생성된 all.tar 파일은 -cvf 옵션으로 그냥 tar로 묶은 파일과 동일하다.

 

cf2. 압축 혹은 묶을 대상 파일들을 '*' 대신 '.' 으로 쓰는 이유는.. '*' 을 사용할 경우, 현재 폴더에 있는 hidden 파일들이 포함되지 않기 때문임 (sub 폴더 안에 있는 hidden 파일들은 포함이 됨)

 

 

응용편

@ tar에서 pigz을 이용하기

> tar -cvf all.tar.gz -I pigz .

 

현재 경로에 있는 모든 파일들을 pigz를 사용해서 압축하라는 의미

-I 옵션은 --use-compress-program 의 짧은 표현

 

아래 명령어와 결과는 같지만 CPU 코어 수에 따라 훨씬 빠른 결과가 나올 수 있음

> tar -czvf all.tar.gz .

 

아래와 같이 사용도 가능함

> tar -cvf - . | pigz > all.tar.gz

 

압축을 해제할 때도 마찬가지로 사용가능

> tar -xvf all.tar.gz -I pigz

 

 

@ tar 작업시 working directory 지정하기

> tar -xzvf all.tar.gz -C ../test

 

-C 옵션은 --directory 의 짧은 표현으로, 원래 GNU 스펙상으로는 tar로 묶는 경우에도 작동하게 되어 있는데.. 실제로 많은 linux 배포판에서 묶는 경우에는 제대로 작동하지 않고, 해제시에만 제대로 작동한다고 함.. Ubuntu 에서 테스트시에도 묶는 경우에는 제대로 동작하지 않았음.

 

만약 묶는 경우에도 directory 옵션을 사용하고 싶다면.. 아래와 같이 압축될 파일명에 절대 경로를 지정하면, 우회해서 사용이 가능함.

> cd /opt/test && tar -cvf /root/test.tar.gz -I pigz . && cd -

 

 

@ standard output 

gzip, gunzip, pigz 등은 -c 옵션으로 결과를 standard out (화면출력) 으로 처리가 가능.

이 경우 원본 파일이 삭제 되지 않음

 

따라서 아래 커맨드들은 모두 결과가 (거의) 같음

> gzip -k abc.txt
> gzip -c abc.txt > abc.txt.gz
> pigz -c abc.txt > abc.txt.gz

 

테스트 결과 Ubuntu기준 -k 옵션을 사용한 경우에는 abc.txt.gz 의 파일 생성 일자가 abc.txt와 같은 날짜로 기록되는데, redirect (>) 를 사용한 경우에는 파일 생성 일자가 실행시간으로 기록됨

반응형
반응형

* 이 포스트는 "파이썬 프로그래밍으로 지루한 작업 자동화하기" 의 내용을 참조해서 작성하였습니다.

* 파이썬 3.3을 기준으로 작성하였습니다.



파일 및 폴더 관리


shutil, os 모듈을 이용한 파일 및 폴더 관리에 대해서 알아보겠습니다.



파일 혹은 폴더 복사하기


>>> import shutil

>>> shutil.copy('/tmp/spam.txt', '/tmp2')

# /tmp 경로에 있는 spam.txt 파일을 /tmp2 경로로 복사합니다.

>>> shutil.copy('eggs.txt', '/tmp2/eggs2.txt')

# 현재 작업 경로에 있는 eggs.txt 파일을 /tmp2 경로에 eggs2.txt 파일로 이름을 변경하여 복사합니다.

>>> shtuil.copytree('/tmp/bacon', '/tmp/bacon_backup')

# /tmp/bacon 폴더에 있는 모든 내용을 /tmp/bacon_backup 으로 복사합니다.


 

파일 혹은 폴더 이동 및 이름 바꾸기


>>> import shutil

>>> shutil.move('/tmp/bacon.txt', '/eggs')

# 만약 /eggs 라는 폴더가 있다면, /tmp 경로에 있는 bacon.txt 파일을 /eggs 경로로 이동합니다.

# 만약 /eggs 라는 폴더가 없다면, /tmp 경로에 있는 bacon.txt 파일을 / 경로로 옮기고 파일 이름을 eggs 로 변경합니다.

>>> shutil.move('/tmp/bacon.txt', '/eggs/new_bacon.txt')

# /tmp 경로 있는 bacon.txt 파일을 /eggs 경로로 옮기고 파일 이름을 new_bacon.txt 로 변경합니다.



파일 혹은 폴더 지우기


 os.unlink()

 파라미터로 보내진 경로에 있는 파일을 삭제합니다. 

 os.mkdir()

 파라미터로 보내진 경로에 폴더를 생성합니다. 

 os.rmdir()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 해당 경로에는 어떤 파일이나 폴더도 없는 빈 폴더여야 합니다.

 shutil.rmtree()

 파라미터로 보내진 경로에 있는 폴더를 삭제합니다. 그 안의 파일 및 폴더도 모두 삭제됩니다.



다음은 확장자가 txt 인 파일을 모두 삭제하는 코드입니다.


>>> import os

for filename in os.listdir():

if filename.endswith('.txt'):

os.unlink(filename)



디렉토리 경로 탐색


os.walk() 함수를 이용합니다.


>>> import os

>>> for folderName, subfolders, filenames in os.walk('.'):

>>>    print (folderName, subfolders, filenames)




파일 압축하기


zipfile 모듈을 이용한 파일 압축에 대해서 알아보겠습니다.



ZIP 파일 읽기


ZipFile 객체를 생성하여 필요한 작업을 수행하고 객체의 리소스를 해제해 줍니다.


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

# example.zip 파일로 부터 ZipFile 객체를 생성합니다.

>>> testZip.namelist()

# example.zip 파일에 포함된 파일 리스트를 출력합니다.

>>> testFile = testZip.getinfo('test.txt')

# example.zip 파일에 들어 있는 test.txt 파일에서 정보를 읽어서 ZipInfo 형태의 객체를 돌려줍니다.

>>> testFile.file_size

# test.txt 파일의 압축되기 전 크기를 출력합니다.

>>> testFile.compress_size

# text.txt 파일이 압축된 파일 크기를 출력합니다.

>>> testZip.close()

# 객체의 리소스를 정리합니다.



ZIP 파일에서 추출하기


extract, extractAll 메소드를 이용하여 파일을 추출합니다.



전체 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extractAll()

# 현재 작업 경로에 example.zip 파일에 있는 모든 파일을 추출합니다.

>>> testZip.close()



일부 파일 추출하기


>>> import zipfile, os

>>> testZip = zipfile.ZipFile('example.zip')

>>> testZip.extract('test.txt')

# 현재 작업 경로에 test.txt 파일을 추출

>>> testZip.extract('test.txt', '/tmp)

# /tmp 에 test.txt 파일을 추출



파일에서 압축하기


압축 파일을 생성하려면, ZipFile 객체를 생성할 때, 두 번째 인수로 'w' 를 전달하여 쓰기 모드로 열면 됩니다. 

파일을 압축해서 추가할 때는 write() 메소드를 사용합니다.


>>> import zipfile

>>> newZip = zipfile.ZipFile('new.zip', 'w')

>>> newZip.write('spam.txt')

>>> newZip.close()




반응형

'프로그래밍 > Python' 카테고리의 다른 글

Python에서 Singleton 구현  (0) 2024.10.19
decorator 사용하기  (0) 2024.06.06
8. 파일 읽고 쓰기  (0) 2019.02.21
7. 정규 표현식  (0) 2019.01.09
6. 문자열 다루기  (0) 2019.01.08

+ Recent posts