find 명령 usages

find 명령에서 자주 사용하는 쓰임새를 요약했다.

2018-05: rm, i-node 내용 추가
{:.right-history}

find 명령

find 명령 요약

주어진 이름으로 찾아 화면에 출력한다. -name 은 대소문자 구분한 이름을 준다.

1
find ./ -name '*.xml' -print

주어지는 이름의 패턴은 *? 를 사용할 수 있다.

찾은 결과를 받아 명령의 입력으로 실행할 수 있다. 다음은 현재 디렉토리 밑에서 .c 파일을 찾아 md5sum 으로 해시 값을 출력한다. -iname은 대소문자 구분을 하지 않는다.

1
2
find -iname "*.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c

검색시 탐색 깊이는 -maxdepth 혹은 -mindepth를 사용할 수 있다.

1
find -maxdepth 2 -iname "*.c" -exec md5sum {} \;

어떤 파일을 제외한 것만 찾을 수 있다:

1
find -maxdepth 1 -not -iname "mycprogram.c"

파일의 퍼미션으로 찾을 수 있다.

1
2
3
find . -perm -g=r -type f -exec ls -l {} \;
find . -perm g=r -type f -exec ls -l {} \;
find . -perm 040 -type f -exec ls -l {} \;

찾은 후 삭제하기:

1
find ./ -name 'Debug' -exec rm -rf {} \;

find 명령으로 i-node를 통해서 지우기:

아래 처럼 특수문자로 “~” or “a b c” 등의 이상한 파일이 있을 경우 inode를 확인해 삭제에 유용하다.

1
2
3
4
$ ls -i
$ 32471 a b c
$ find . -inum 32471 -exec rm -rf {} ';'
$ find . -inum 32471 -exec rm -rf {} \;

회피문자 파일 이름 삭제하기

???? 같이 지워지지 안는 파일 같은 경우도 i-node로 삭제할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
~$ ls -ali
~$ ls -ali
total 2068
42467329 drwxr-xr-x 11 qkboo qkboo 4096 Jun 20 22:54 .
2 drwxr-xr-x 10 qkboo qkboo 4096 Jun 1 12:56 ..
42467482 drwxr-xr-x 2 qkboo qkboo 12288 Jul 2 2016 .Picasa3Temp
42598444 drwxrwxrwx 3 qkboo qkboo 4096 Mar 29 23:45 ??????
42475521 drwxr-xr-x 4 qkboo qkboo 4096 Jun 20 22:52 Design_Assets
42467936 drwxr-xr-x 14 qkboo qkboo 4096 Mar 4 16:39 Incoming

~$ find . -inum 42598444 -exec rm {} \;

파일 형식으로 검색

옵션 -type 은 파일 형식으로 찾을 수 있다. 파일 형식은:

b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket

일반 파일

1
find . -type f

소켓 형식의 파일

1
find . -type s

디렉토리 형식

1
find . -type d

숨겨진 파일만 검색도 가능하다.

1
find . -type f -name ".*"

역시 숨겨진 디렉토리만 찾을 수 도 있다.

1
find -type d -name ".*"

파일 크기로 검색

옵션 -size 를 사용해서 파일의 크기로 찾을 수 있다.

아래는 어떤 크기 보다 크거나, 작은 파일을 찾아 준다.

1
2
3
find -size +100M     # 보다 큰 파일
find -size -100M # 보다 작은 파일
find -size 100M # 같은 크기의 파일

다음 같이 응용해 볼 수 있다. 100MB 보다 큰 파일을 찾아 삭제한다:

1
find / -type f -name *.zip -size +100M -exec rm -i {} \;

파일의 수정된 시간을 기준

모든 파일의 수정된 시간 정보를 알 수 있다. test_1.txt의 시간을 기준으로 검색해 보자.

1
2
ls -lrt test_1.txt
-rw-r--r-- 1 gtko gtko 0 2011-02-01 02:26 test_1.txt

옵션 -newer 에 대상 파일을 주면 해당 파일을 생성한 날짜 이후의 결과만을 표시하게 된다.

1
2
3
4
5
find -newer test_1.txt
.
./dir2
./dir2/file2
./dir2/file3

자주 사용할 만한 find 명령

유용한 find 명령들 alias로 만들어 사용하기도 한다.

a.out 인 파일 지우기

1
alias rmao="find . -iname a.out -exec rm {} \;"

c프로그램의 core 파일

1
alias rmc="find . -iname core -exec rm {} \;"

큰 파일 삭제…

1
2
3
4
alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"

iconv 와 결합

iconv로 파일 인코딩을 변환할 수 있는데, 많은 파일을 한번에 처리하기 위해서 find와 결합해 찾은 모든 파일의 파일 인코딩을 변환할 수 있다.

다음은 .c 파일을 찾아 인코딩을 euc-kr에서 utf-8로 변환하는 명령이다.

1
find ./ -name '*.c' -exec iconv -feuc-kr -tutf-8 {} -o {} \;

find 를 사용하지 않는다면, 디렉토리 안에 있는 모든 파일의 인코딩을 변환하고자 할 때는 shell 조건문과 섞어서 사용할 수 있다.

1
$ for F in './*.sql'; do iconv -c -feuc-kr -tutf-8 $F -o $F; done

참조

Linux find command examples

update-alternatives 명령 사용

이 글은 우분투, 리눅스 박스에서 여러버전의 도구를 관리할 수 있는 update-alternatives 를 다루고 있다.

update-alternative

update-alternative 유틸리티로 리눅스 기본 제공 개발 환경의 gcc, cross compiler용 gcc 등 여러 버전의 gcc를 사용할 수 있게 구성할 수 있다.
이들 버전의 환경을 교체해서 사용하기를 원한다. update-alternative 도구를 사용할 수 있다.

update-alternative 사용

여러 버전의 gcc를 update-alternative를 사용해서 선택적으로 사용할 수 있다. gcc 로 등록된 현재 버전 목록을 질의 한다.

1
$ update-alternatives --query gcc

등록

여기서 사용하는 여러 gcc 버전들을 설치한 후에 다음과 같은 명령어로 등록을 할 수 있다.

1
update-alternatives --install <link> <name> <path> <priority>
  • 실행파일 이름으로 /etc/alternatives/ 을 가리킨다. (예: /usr/bin/pager)
  • 해당 링크 그룹의 대표 이름으로, 여러 가지 버전의 패키지들을 대표하는 이름으로 보면 될 것 같다.(예: pager)
  • alternatives 로 실제 연결할 실행파일 이름으로, 시스템에 설치한 패키지의 실행파일 이름이다.(예: /usr/bin/less)
  • automatic 모드에서 어떤 것을 자동으로 선택해서 사용할지 결정할 때 사용되는 우선순위로, 높은 수가 더 높은 우선순위이다.

gcc 등록

Ubuntu 14.04 최신 버전에 gcc4.7, 4.8 를 사용하려고 설치했다고 가정한다.

1
2
3
sudo apt-get update
sudo apt-get install gcc-4.7 g++-4.7
sudo apt-get install gcc-4.8 g++-4.8

그리고 gcc 그룹에 4.8를 우선도가 높게 50으로 준다.

1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8

여기서 gcc를 master로 g++을 slave로 준비했다. --slave 옵션은 --install 로 지정한 master에 종속해서 여러개의 슬레이브를 마스터에 추가할 수 있고, 마스터의 링크가 바뀌면 슬레이브도 함께 바뀐다.

두번째 버전은 gcc-4.7 버전을 우선도가 40 정도로 하자.

1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 50 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7