본문 바로가기

About/Linux

[Linux] find 명령어로 파일 모으기(특정 파일만 압축하기)

Linux에서 파일을 압축할 때 원하는 파일이 적절하게 모여있으면 tar 같은 명령어로 적절하게 압축할 수 있습니다. 하지만 디렉토리에 원하지 않는 파일들도 함께 있는 경우에 tar 명령어로 압축한다면 원하지 않은 파일도 압축파일에 포함될 것입니다. 이는 find 명령어를 통해서 해결할 수 있습니다.

 

명령어는 Ubuntu 16.04.7 LTS 버전에서 실행하였습니다.


find 명령어 사용

find 명령어는 파일 시스템을 검색하여 주어진 규칙에 맞는 파일들을 찾아 파일들의 이름과 위치를 표준 출력(stdout)으로 출력합니다. 이 출력 메시지는 tar과 같은 명령어로 쉽게 리다이렉션될 수 있습니다. 

 

예를 들어 .jpg 파일을 제공하는 웹 사이트를 호스팅하는 경우 파일들이 /var/www/html/ 아래 여러 디렉토리에 흩어져있어서 파일들을 일일이 찾아내가 쉽지 않습니다.

이 때 find tar 명령어를 이용하여 /var/www/html/ 디렉토리를 검색하여 확장자가 .jpg인 파일들을 찾아내고,
파일을 찾으면 tar 명령어를 실행하여 이 파일들을 images.tar 아카이브에 추가할 수 있습니다. (tar에 -r 옵션을 주면 아카이브를 덮어쓰지 않고 기존 아카이브에 내용을 추가합니다.)

 

 

/var/www/html 디렉토리의 파일들이 다음과 같이 구성되어있다고 가정해보겠습니다. 

html/
├── 1.jpg
├── 1.mp4
├── 2.jpg
├── 2.mp4
├── 3.jpg
├── 4.jpg
├── images
│   ├── 1.jpg
│   ├── 1.mp4
│   ├── 2.jpg
│   └── 2.mp4
└── index.html

jpg와 mp4파일들이 모두 존재하며 내부의 images 폴더에도 jpg와 mp4파일들이 섞여있습니다

이 때 jpg파일들만 가져와서 압축하는 명령어는 다음과 같습니다.

# find /var/www/html -iname "*.jpg" -exec \ 
tar -rvf images.tar {} \;
  • find의 -iname 옵션은 대문자와 소문자를 모두 매칭하고, -name 옵션은 대소문자를 구분합니다. 여기서는 iname을 사용합니다.
  • find 명령어로 .mp4 파일을 모두 찾고 tar 명령어를 실행합니다. 
  • 마지막의 {} 기호는 find로 찾아낸 모든 파일을 적용한다는 의미입니다.

 

위의 명령어를 find로 찾아진 파일명들이 출력되며 images.tar 아카이브에 추가되는 것을 확인할 수 있습니다.

 

실행결과

아카이빙된 파일을 풀어서 제대로 파일들이 아카이브 됐는지 확인해보겠습니다.

 

# tar -xvf images.tar
# tree /var/

실행결과

이미지 파일들이 원래와 같은 형태로 존재하는 것을 확인할 수 있습니다.

 

 

find 명령어를 사용할 때는 sudo로 실행하여 모든 파일을 검색할 수 있게하는 것이 좋습니다.(일반 사용자로 사용하는 경우 접근 못하는 디렉토리 및 파일은 못 찾을 수 있음)

 

 

find 명령어와 비슷하게, 빠르게 파일을 찾을 수 있는 locate라는 명령어도 존재합니다. locate 명령어는 전체 시스템에서 지정한 문자열에 매칭되는 파일을 찾습니다. 하지만 파일 시스템 자체를 검색하지 않아서 검색 결과의 정확성이 조금 떨어진다는 단점이 있습니다.


find 명령어를 통해 특정 파일만 압축하는 방법을 알아보았습니다.