'파일 개수'에 해당되는 글 1

  1. 2010.12.17 unix] 기본 명령어 및 파일 개수 파악
카테고리 없음 | Posted by 낫기법필 2010. 12. 17. 11:42

unix] 기본 명령어 및 파일 개수 파악



========================================================

========================================================


========================================================
wc 가 일명 워드 카운트 명령업니다.

파일이 몇 갠지 세려면 ls | wc 하면 되겠죠.
유닉스에서 카운트는 wc 입니다.

해당 디렉토리로 간다음...
# ls | wc -l  하면 파일 갯수가 출력됩니다

[출처] http://wingh.egloos.com/4802314
========================================================


========================================================
디렉토리의 용량을 구할때는 du명령으로 찾으면 되지만
디렉토리 내부의 서브디렉토리나 파일의 수를 구하기는 어렵습니다.
그럴때 사용할 수 있는 방법을 적어보겠습니다.

서브디렉토리까지 포함 디렉토리 갯수 구하기
ls -Rl |grep ^d |wc -l

파일갯수 구하기
ls -Rl |grep ^- |wc -l


[출처] http://www.inet.co.kr/faq/stories.php?story=10/10/26/1116782
========================================================

========================================================
▣ LINIX 기본 명령어

 

▶ ls : 파일 시스템 상의 파일을 목록을 보여준다.

문법
■ ls [ -aCxdlstucriFR ][ 파일명(들) ]
옵션
? -a : 도트로 시작되는 이름을 가진 파일명도 전부 보여준다.
? -C : 가로 순서로 나열하여 출력한다.
? -x : 세로 순서로 나열하여 출력한다.
? -d : 현재 디렉토리에 대한 정보를 출력한다.
? -l : 각 파일들에 대한 소유자, 권한, 갱신일 등의 자세한 정보를 출력한다.
? -s : 파일이 얼마나 많은 디스크 블록을 차지하고 있는가를 보여준다.
? -t : 파일 갱신일 순서대로 정렬한다.
? -u : 엑세스(access)한 날짜 순서대로 정렬한다.
? -c : inode가 마지막 바뀐 시간 순서대로 정렬한다.
? -r : 정렬된 순서의 역으로 출력한다.
? -i : 파일의 inode 번호를 보여준다.
? -F : 파일의 특성을 쉽게 알 수 있는 문자를 나타낸다. +는 실행 가능한 파일을, /는 디렉토리 이름을 의미한다. @는 심볼릭 링크를 나타내고, =는 소켓(socket)을 나타낸다. 하지만 여러분의 리눅스는 기본적으로 이러한 특성을 보여줄 것이다.
? -R : 현 디렉토리의 내용은 물론이고 서브 디렉토리의 내용까지 전부 보여준다.


▶ cd :현재 작업하는 디렉토리를 변경한다.
문법
■ cd [ 디렉토리 ]

설명
디렉토리 이름과 cd 명령 사이에 반드시 공백이 있어야 한다. 디렉토리 이름을 주지 않고 수행하면 사용자의 홈 디렉토리로 이동한다. 자신이 이동하고자 하는 디렉토리는 자신에게 실행 권한(execution permission)이 있어야 한다.

사용예
■ $ cd /home [Enter]'
■ $ pwd [Enter]'
■ /home


▶ pwd
: 현재 작업하는 디렉토리를 알기 위해서 pwd 명령을 사용한다.
문법
■ pwd

설명
현 디렉토리(current directory)가 무엇인지 보여준다.

사용예
■ $ pwd
■ /home/blade


▶ cat
cat은 catenate(사슬로 잇다. 연결하다)에서 이름이 유래한다. 이것은 파일의 내용을 화면에 출력하는 데 사용되기도 하며 파일을 다른 곳에 순차적인 스트림으로 보내기 위해 사용된다.

문법
■ cat [ -benstuvETA ] [ 파일명(들) ]

옵션
? -b : 공백 외의 글자가 있는 모든 행의 개수를 센다.
? -e : 제어 문자를 ^ 형태로 출력하면서, 각 행의 끝에 $를 추가한다. -vE와 같다.
? -n : 각 행을 출력하면서 행 번호를 함께 첨부한다.
? -s : 중복되고 겹치는 빈 행은 하나의 빈 행으로 처리한다.
? -r : 행바꿈 문자를 제외한 제어 문자를 ^ 형태로 출력한다. -vT와 같다.
? -u : 유닉스 호환성을 위해 추가된 옵션으로서 무시된다.
? -v : tab과 행바꿈 문자를 제외한 제어 문자를 ^ 형태로 출력한다.
? -E : 각 행마다 끝에 $ 문자를 출력한다.
? -T : 시로서 탭(tab) 문자를 출력한다.
? -A : -vET 옵션을 사용한 것과 같은 효과를 가진다.

사용예
■ $ cat document.1 ,,document.1 파일을 화면으로 출력한다.


▶ finger
: 시스템 상의 사용자들에 대한 정보를 보여준다.

문법
■ finger [ -slpm ][ 사용자 ]
옵션
? -s : 사용자의 로그온 이름, 실제이름, 터미널 이름, 로그온 시간 등등을 보인다.
? -I : -s 옵션 정보에 몇 가지를 추가하여, 여러 줄에 걸쳐서 보여준다.
? -p : -l 옵션 정보에서 .plan과 .project 파일을 보이지 않는다.

설명
인수로 아무 것도 주어지지 않으면, finger는 현재 시스템에 로그인되어 있는 사용자들을 보여준다. 옵션이 주어지지 않으면, 기본적으로 -l 옵션을 사용한 것으로 간주된다.

사용예
■ $ finger
■ Login Name Tty Idle Login Time Office Office Phone
■ blade kimtaihan 2 1 Oct 20 11:31
■ root root 1 Oct 20 11:28


▶ mkdir
: 디렉토리를 새로 만들기 위해 mkdir 명령을 사용한다.

문법
■ mkdir [ -m mode ][ -p ] directory

옵션
? -m : 디렉토리를 만들 때 같이 사용하여 사용자 권한을 줄 수 있다.
? -p : 만들 디렉토리의 상위 디렉토리까지 한꺼번에 만든다.

사용예
■ $ mkdir blade.seoul [Enter]' ,,현재 디렉토리의 하위 디렉토리 작성
■ $ cd blade.seoul [Enter]'
■ $ mkdir -p blade/books [Enter]'
이것은 현재 디렉토리에서 하위 디렉토리 blade를 먼저 만든 후에 다시 그 하위 디렉토리로 books를 만든다.


▶ rm
파일을 지우는 명령이다. 이것은 remove의 의미를 가진 이름임을 기억하라.

문법
■ rm [ -firv ] 파일명
옵션
?-f : 보통 지울 수 있는 권한이 없으면 안되지만, 이 옵션을 사용하면 성가신 작업을 하지 않고서도 강제로 파일을 지울 수 있다.
?-i : 파일을 지울 것인가 다시 물어본다. 지우기를 원한다면 y를 누른다.
?-r : 서브 디렉토리의 파일도 모두 재귀적으로 지운다.
?-v : 파일을 지우기 전에 파일의 이름을 나타내준다.

사용예
■ $ rm blade.Z [Enter]'
■ $ rm report.txt tempfile object.mainroutine hello.java[Enter]'
■ $ rm -r blade ,, blade와 하위 디렉토리 파일 모두를 제거


▶ rmdir
원하는 디렉토리를 제거한다.

문법
■ rmdir [ -p ] 디렉토리
옵션
?-p : mkdir의 -p 옵션의 반대 동작으로 하위 디렉토리와 그 상위 디렉토리 모두를 제거할 수 있다. 이때 모든 디렉토리는 비워져 있어야 한다. 수행 후 결과가 어떻게 되었는지를 보여준다.


▶ who
현재의 시스템에 접속한 사용자의 이름이나 로그온 정보를 보여준다.

문법
■ who [ -uTHqs ] [로그온 정보파일 ]
■ whoamI

옵션
?-u : 현재 시스템에 누가 로그온되어 있는지 보여준다.
?-T : 사용자의 터미널이 메시지를 보낼 수 있는지를 알려준다. +기호는 메시지를 쓸 수 있고, -는 그렇지 않음을 보여준다.
?-H : 헤더 라인을 프린트한다.
?-q : 사용자 이름과 카운트가 구분된 목록을 보여줌, 다른 옵션은 무시된다.
?-s : 호환을 위해 포함된 옵션으로 무시된다.

■ $ whoamI [Enter]'
이런 명령도 가끔은 필요할 것이다. 가령 친구의 계정으로 로그인했는데 그것을 잊어버렸을 경우라든지 아무도 없는 학교 실습실에 켜진 채 놓여진 터미널을 발견했을 때 누가 사용하다가 자리를 비웠는지 알고 싶을 때 등이다.


▶ more
한 화면씩 츨력을 보여주는 유틸리티, 한 번에 전체적으로 볼 수 없는 파일은 이것을 사용하여 스크롤을 제어할 수 있다.

문법
■ more [ -ncdflspu ][ +줄번호 ][ 파일이름(들) ]
옵션
? -n : 여기서 n은 숫자를 의미하여, 숫자는 출력 윈도우의 행수를 지정한다.
? -c : 위에서부터 한 행씩 지운 후 한 행씩 출력한다. 보통은 화면 전체를 지운 후 각 행을 출력하기 시작한다. 특정한 터미널을 위해 사용한다.
? -d : 스페이스나 q 키를 누르라는 프롬프트를 출력한다.
? -f : 화면의 행이 아닌 논리적인 행 수를 계산한다. 보통은 긴 칼럼의 행은 화면에서 행바꿈을 하여 새로운 행으로 계산된다. -f 옵션을 사용하면 이러한 행은 계산하지 않는다.
? -s : 여러 개의 빈 공백행은 하나로 취급한다.
? -p : 스크롤하지 않는다. 대신 화면을 지우고 출력한다.
? -u : 밑줄 차기를 금지한다.

사용예
■ $ cat document.97 | more

기본적으로 more 명령은 첫 번째 줄 내용부터 출력한다. 하지만 원하는 부분부터 출력을 원한다면 다음과 같은 방법으로 실행할 수 있을 것이다. 다음은 13번째 행부터 출력을 시작한다.
■ $ more +13 loveletter.txt [Enter]'


▶ clear
clear 명령은 도스의 cls와 마찬가지로 화면을 지우는 동작을 한다.


▶ hostname
: 현재 설정되어 있는 호스트의 이름을 표시하거나 변경한다.

문법
■ hostname [ 호스트이름 ]

설명
이것은 인수없이 사용된다면 현재 설정되어 있는 호스트 이름을 보여준다. 리눅스는 기본적으로 프롬프트에서 호스트의 이름을 보여줄 것이다. 혹은 사용자가 프롬프트에 호스트 이름이 나타나도록 할 수도 있다. 인수로서 새로운 호스트 이름을 지정한다면 새로 지정된 이름으로 호스트 이름을 바꾼다. 하지만 이런 작업은 수퍼 유저만이 할 수 있다.

사용예
■ $ hostname
■ Blade


▶ cp
: 파일을 현재의 위치나 다른 디렉토리로 복사(copy)한다.

문법
■ cp [ -abdfilPprsuvxR ] 파일명1 파일명2
■ cp [ -abdfilPprsuvxR ] 파일명(들) 디렉토리
옵션
? -a : 가능한한 원 파일의 구조와 속성을 그대로 복사한다.
? -b : 복사할 때 덮어쓰게 되는 파일은 백업을 만든다.
? -d : 심볼릭 링크는 심볼릭 링크로 복사한다. 그리고 원본 파일과의 하드 링크 관계를 유지한다.
? -f : 복사 위치에 존재하는 파일을 제거하고 복사한다.
? -i : 복사시 같은 이름의 파일이 존재한다면 덮어쓸 것인가 확인한다.
? -I : 하드 링크를 만든다.
? -P : 원본 파일의 소유자, 그룹, 권한, 시간 기록을 그대로 복사한다.
? -r : 파일과 하위 디렉토리에 포함된 파일 모두를 재귀적으로 복사한다.
? -s : 디렉토리가 아닌 파일의 심볼릭 링크를 만든다. 소스 파일의 이름은 전체 경로 이름으로 한다. 목적지 파일 이름은 전체 경로를 주지 않아도 현재 디렉토리로 간주되므로 상관없다.
? -u : 파일의 정보를 갱신한다.
? -x : 다른 파일 시스템인 하위 디렉토리는 무시한다.
? -R : 디렉토리를 재귀적(recursive)으로 복사한다.

설명
만일 파일명2가 이미 존재하는 파일의 이름이라면 기존에 있던 파일은 사라지고 새로운 복사본 파일로 바뀐다. 이것이 원하지 않는 결과라면 -i 옵션을 주어서 확인 작업을 거칠 수 있다. -i 옵션은 파일명2가 이미 존재하는 이름이라면 그대로 복사할 것인지 아닌지를 선택할 수 있게 물어온다.

사용예
■ $ cp -i blade.Z temp.Z
■ $ cp -r * /somewhere
당연히 -r 옵션은 파일명2가 디렉토리 이름일 때만 사용이 가능하다.


▶ mv
: 파일의 위치를 이동하거나 파일의 이름을 바꾸어준다.

문법
■ mv [ -fi ] 파일명1 파일명2
■ mv [ -fi ] 파일명(들) 디렉토리명
옵션
? -f : 같은 이름의 파일이 존재하고 쓰기 권한이 금지되어 있더라도 물어보지 않고 덮어쓰기를 해버린다. 이런 경우 이 옵션을 사용하지 않으면 사용자에게 다시 확인을 할 것이다.
? -i : 파일을 덮어쓰기 전에 사용자에게 확인한다.

설명
기존에 있던 파일을 원치않게 잃어버리는 수가 있기 때문에 확실하지 않다면 -i 옵션을 사용하는 것을 권한다.

사용예
■ $ mv sisap.hong victor.dongki readme.txt ../friend [Enter]'
■ $ mv blade.Z ../kimtaihan.Z [Enter]'
■ $ mv /home/blade /home/friend [Enter]'
■ $ mv sisap.doc LeeKiHong.doc [Enter]'


▶ date
: 시스템은 현재의 날짜와 시간을 유지하고 있다. date 명령을 사용하면 그러한 시간을 확인할 수 있다. 또한 날짜와 시간 정보를 변경할 수 있다. 물론 시스템의 날짜와 시간은 슈퍼 유저만이 변경할 수 있다.

사용예
■ $ date [Enter]'
The Oct 1 15:57:23 KST 1996


▶ df
: 디스크의 여유 공간을 검사하여 보고한다.

문법
■ df [ -aikpvtx ] 파일시스템
옵션
? -a : 0 블록을 가진 파일도 보고한다. 기본적으로는 무시한다.
? -i : 블록 사용 대신 incode 사용 정보를 보고한다.
? -k : 블록의 크기를 1K바이트로 계산한다.
? -p : POSIX 형태의 출력을 한다.
? -v : System V의 df와의 호환을 위한 옵션이다. 무시된다.
? -t 형태 : 특정 형태의 파일 시스템으로 검사를 제한한다.
? -x 형태 : 특정 형태의 파일 시스템 이외의 것으로 검사를 제한한다.

설명
이것은 바이트 크기를 사용하는 대신 블록 단위로 보고한다는 점을 유의해야 한다. 기본적으로 512바이트 크기로 한 블록을 다룬다.


▶ env
: 현재의 환경에 영향을 주지 않고 원하는 환경을 만들어 명령을 실행한다. 또는 현재의 환경을 보고한다.

문법
■ env [ - ][-i ][ -u 이름 ][ 이름=값 ][명령]

옵션
? - : 뒤에 오는 이름=값 목록으로 환경을 제한한다.
? -i : 현재의 환경을 무시하고 빈 환경 상태로 시작한다.
? -u 이름 : 현재의 환경에 그 이름의 변수가 있다면 제거한다.

설명
'이름=값'의 형식으로 특정 환경 변수를 지정해서 명령을 실행한다. 이러한 값을 필요한 대로 여러 개 나열하면 되고, 현재의 환경은 변경하지 않으므로 명령의 수행이 끝나면 환경의 상태는 이전과 다름없게 된다.

사용예
■ $ env HOME=/usr/victor tsh

홈 디렉토리 변수를 지정하여 셸을 실행한다.
■ $ env ,,현재 설정되어 있는 환경 변수들을 보여준다.


▶ find
: 원하는 특정 파일을 디렉토리를 탐색하여 찾는다. find는 매우 강력한 도구로 특정 디렉토리들을 순회하면서 지정된 조건에 만족하는 파일을 찾는다. 파일의 조건은 이름이나 크기, 날짜 등 다양하게 지정할 수 있다.

문법
■ find [ 디렉토리 ] 탐색 조건

탐색 조건
? -name 파일명 : 찾고자 하는 파일의 이름을 정한다. 와일드 카드도 가능하다.
? -perm 모드 : 파일 권한(permission)이 일치되는 것을 찾는다. 원하는 권한은 ls로 볼 수 있는 형태와 같이 지정한다.
? -type ? : 형태가 같은 파일을 찾는다. 물음표(?) 부분에 디렉토리는 d, 파이프는 p, 심볼릭 링크는 l, 소켓은 s, 블록 파일은 b, 일반 파일은 f 등의 기호를 사용한다.
? -links ? : 특정 개수의 링크를 가진 파일을 찾는다. 물음표 부분에 링크의 숫자를 표기한다.
? -size ? : 파일의 크기가 일치하는 것을 탐색한다. 파일 크기는 블록단위로 물음표 부분에 지정한다. 한 블록은 512바이트로 내정되어 있지만 블록 숫자 뒤에 단위로 k자를 붙이면 1키로바이트 크기의 블록 숫자로 간주된다.
? -user 사용자 : 파일 사용자의 ID에 따라서 검색한다. 로그인 이름이나 번호 모두가 가능하다.
? -atime ? : 최근 며칠내에 엑세스한 파일을 검색한다. 날짜수는 ?에 명시한다.
? -exec 명령 : 원하는 검색 조건에 맞는 파일을 찾으면 명시된 명령을 실행한다. 명령의 끝은 \;을 사용하여 끝낸다. find가 검색해낸 파일의 이름을 인수로 사용하고 싶다면 그 위치에 {}를 사용한다.
? -newer 파일 : 어떤 파일보다 최근에 갱신된 모든 파일을 검색한다.

사용예
■ $ find /bin -name ro*
■ $ find -user qwfwq -exec cat {} list\;


▶ chmod
파일의 모드를 바꾼다. 파일의 모드는 권한(permission) 을 제어한다.

문법
■ chmod [ -cfvR ] 모드 파일명(들)
■ chmod [ -cfvR ] 레벨 동작 권한 파일이름(들)

옵션
? -c : 실제로 파일의 권한이 바뀐 파일만 자세히 기술한다.
? -f : 파일의 권한이 바뀔 수 없어도 에러 메시지를 출력하지 않는다.
? -v : 변경된 권한에 대해서 자세히 기술한다.
? -R : 디렉토리와 파일들의 권한을 재귀적으로 모두 바꾼다.

사용예
■ $ chmod 666 broadboard ,,파일을 모두가 읽고 쓸 수 있도록 한다.
■ $ chmod 746 broad ,,파일 권한을 -rwxr--rw-로 변경한다.
■ $ chmod o+x,g-w broadboard


▶ file
: 파일이 어떠한 형태의 파일인지 알아낸다.

문법
file [-czL ][ -fm 파일명 ] 파일명(들)
옵션
? -c : 매직 파일의 파싱된 형태를 보여준다.
? -z : 압축되어 있는 파일의 형태를 검사한다.
? -L : 뒤따르는 심볼릭 링크를 야기시킨다.
? -f 파일명 : 검사한 파일에 대해 리포트를 만들 파일의 이름을 지정한다.
? -m 파일명 : 파일의 형태를 결정하는 데에 사용되는 매직 파일을 정한다.

설명
파일이 텍스트 문서인지 실행할 수 있는 파일인지 아니면 데이터 파일인지 등을 인식한다. 에디터를 사용해서 보거나 수정될 수 있는 파일인가 알아 보는 데에 많이 사용된다.

사용예
■ $ file -z /home/Book.Z


▶ ln
: 두 개의 파일 사이에 링크를 만들어, 하나의 파일을 두 개 이상의 이름으로 접근이 가능하도록 한다.

문법
■ ln [ -s ] 파일명1 파일명2
■ ln 파일명들 디렉토리

옵션
■? -s : 하드 링크 대신 심볼릭 링크를 만든다.

사용예
■ $ ln project theplan ,,두 개의 이름은 같은 문서를 의미한다.


▶ man
: 사용하고자 하는 유닉스 유틸리티에 대한 매뉴얼(manual)을 검색해서 보여준다.

문법
■ man [ 장 ] 단어
■ man -k 키워드
옵션
? -k : 인수로 주어진 단어를 키워드로 사용하여, 해당 키워드가 발견되는 모든 매뉴얼의 내용을 검색하여 보여준다.

설명
셸을 사용할 때 어떤 명령의 사용법이 기억나지 않는 경우가 있다. 혹은 매번 사용하던 명령이라도 특수한 옵션이 필요할 때 그 기호나 사용법을 정확히 확인해야 하는 경우가 많이 있다. 물론 참고 서적을 보면 되겠지만 터미널 상에서 필요한 도움말을 언제라도 제공받을 수 있다. 시스템에 내장된 매뉴얼은 빠르게 볼 수 있을 뿐만 아니라 그 내용도 완벽한 것이어서 옵션의 종류 같은 것은 빠진 것이 없다. 만일 온라인 레퍼런스를 모두 종이로 출력한다면 그 분량은 엄청날 것이 틀림없다.

위에서 보인 첫 번째 형식은 매뉴얼의 장 번호를 이름과 함께 명시해서 검색할 수도 있다. 하지만 보통은 그것을 생략하고, 검색하고자 하는 제목만을 인수로 전달해서 사용한다. 그러면 자세한 내용을 볼 수 있을 것이다. 출력된 내용은 화살표 키를 사용해 위아래로 자유로이 스크롤할 수 있다.

사용예
■ $ man telnet


[출처] http://blog.naver.com/klo510?Redirect=Log&logNo=110004311961
========================================================

========================================================
저자: 드루 라빈, 역 이호재

find 명령어는 유닉스 시스템에서 가장 강력한 유틸리티중의 하나임에 틀림없습니다.

이번 기사에서 find 명령의 문법에 대해 알아보고, 실질적인 예제를 살펴보도록 하겠습니다.

명령어 자체는 매우 간단한 문법을 지니고 있습니다.

find where_to_search expressions

expression 부분은 처음 find를 사용할 때 상당히 혼란스러운 부분입니다. 또한 이 부분은 유닉스마다 조금씩 다른 문법을 가지고 있습니다. 그래서 새로운 시스템에서 find를 이용하고자 한다면 find의 맨페이지를 살펴봐야 합니다. FreeBSD에서 많이 사용되는 expression은 다음과 같습니다.

-name 와일드카드와 함께 사용될 때에는 반드시 따옴표로 묶어야 함
-type 예를 들면 f=file d=directory l=link
-user 이름이나 UID
-group 이름이나 GID
-perm 권한을 지정
-size 다음 512바이트 블럭까지 찾음. byte로 지정하기 위해서는 c를 사용
-atime 파일이 읽힌 가장 최근 시간
-ctime 파일의 소유자나 권한이 바뀐 가장 최근 시간
-mtime 파일이 수정된 가장 최근 시간
-newer 주어진 파일보다 나중에 만들어진 파일을 찾음
-delete 찾은 파일을 삭제
-ls ls -dgils 와 같은 결과를 출력
-print find 명령의 실행 결과를 출력
-exec command {} \; command를 실행. 문법에 주의
-ok 명령어가 실행되기 전 exec대신 사용
-depth 주어진 디렉토리의 루트 디렉토리가 아닌 그 디렉토리의 가장 낮은 레벨에서부터 시작
-prune 어떤 서브 디렉토리를 제외하고자 할 때 사용

위와 같은 표현식을 어떻게 사용하고 결합하는가에 대한 예제를 곧 알아보도록 하겠습니다. 이를 알아 보기 전에 find가 어떤 목적에 쓰여지는가에 대해 알아볼 필요가 있습니다. find가 무엇인지를 알기 위해 whatis 명령어를 사용해 본다면, 답변은 놀랍게도 다음과 같을 것입니다.

whatis findfind(1) - walk a file hierarchy

대략적으로 보자면, find는 당신이 선택한 어떤 표현식에 맞는 파일들을 찾기 위해 디렉토리를 재귀적으로 검색하는 것을 의미합니다. 이러한 기능이 별것 아닌 것처럼 보일수 있지만, 디렉토리와 그 모든 서브 디렉토리를 검색할 수 있는 유닉스 유틸리티는 많지 않습니다. 이러한 유용한 기능은 파일을 찾는 것뿐만이 아니라 다른 일도 할 수 있습니다.

이제 간단한 예제를 살펴보고 좀 더 어려운 표현식에 대해서 살펴보도록 하겠습니다. 가장 간단한 find 사용법은 다음처럼 간단합니다.

find . -print

"."는 당신의 현재 디렉토리를 의미하기 때문에, 이 find 명령어는 현재 이 명령어가 실행되고 있는 디렉토리와 그 모든 서브 디렉토리에 있는 파일을 찾아서 화면에 출력할 것입니다.

FreeBSD 시스템에서 -print는 default 옵션입니다. 그렇기 때문에 아래의 명령어는 위와 똑같은 결과를 보여줍니다.

find .

하지만 -print 옵션을 default로 하지 않는 시스템도 있기 때문에 -print 옵션을 쓰는 습관을 들이는게 좋습니다.

만약 당신이 home 디렉토리에 있는 모든 파일을 찾고자 한다면, 먼저 지금 현재 home 디렉토리에 있는지 확인한 후 find 명령을 내려야 합니다. (아래 참조)

cdfind . -print

cd 명령어는 당신을 home 디렉토리로 이동시켜 줍니다. find 명령어를 통해서 매우 강력한 일을 할 수 있기 때문에, find 명령을 실행시킬 디렉토리로 우선 이동한 후 작업을 시작하는 것이 좋은 습관입니다. 지금부터 필자는 당신이 home 디렉토리에 있다고 가정할 것이고, 이는 부주의로 인해 home 디렉토리 이외의 다른 파일에 나쁜 영향을 끼치는 것을 방지할 것입니다.

위에서 살펴본 예제는 find 명령어가 얼마나 사용하기 쉬운지를 보여주기 위해 쓰여졌습니다. 하지만, 보통 find 명령을 내릴 때에는 특정한 조건에 맞는 것을 찾길 원할 것입니다. 이제 다른 표현식이 나올때가 된 것입니다. 특정한 이름을 갖는 파일을 찾아보도록 합시다.

touch file1find . -name file1 -print ./file1

위의 명령어를 하나하나 살펴보도록 하겠습니다. 먼저 touch 명령어를 이용해서 이름이 file1인 빈 파일을 하나 생성하였습니다. 그리고나서 find 명령을 내릴때 현재 디렉토리(".")에서부터 찾을 것이며 파일이름(-name)이 file1인 것을 찾고 그결과를 화면에 출력하라는 옵션을 주었습니다. 위의 결과에서 file1이 하나 출력되었기 때문에 필자는 현재 디렉토리와 그 하위 디렉토리에 파일이름이 file1인 것은 단 하나 존재한다고 말할 수 있습니다.

보통 find 명령어를 사용해 파일을 찾을 때 찾는 파일이 하나 이상일 것입니다. 예를 들면 특정한 확장자를 갖는 모든 파일을 찾는 것입니다. 필자는 .pdf 파일들을 많이 다운로드하는 경향이 있는데, 그 파일들이 어디에 존재하는지는 잘 기억하지 못합니다. 이제 그것들을 모아서 기존에 존재하는 pdfs라는 디렉토리에 넣고자 합니다. 필자의 home 디렉토리와 그 하위 디렉토리에서 확장자가 .pdf인 모든 파일을 찾고자 한다면 다음과 같이 명령을 내리면 됩니다.

find . -name "*.pdf" -print./pdfs/50130201a.pdf./pdfs/50130201b.pdf./pdfs/50130201c.pdf./pdfs/IWARLab.pdf./pdfs/DoS_trends.pdf./pdfs/Firewall-Guide.pdf./2000_ports.pdf

최근에는 필자가 비교적 정리를 잘 한 것 같습니다. pdfs이외의 디렉토리에 있는 pdf파일이 하나밖에 없으니까요.

한가지 주목해야 할 점은 위의 명령어를 사용할때 *.pdf를 항상 인용부호로 감싸줘야 한다는 것입니다. 즉 *.pdf 대신 "*.pdf"를 사용해야 합니다. 인용부호로 감싸는 방법이 두가지 더 있습니다. 다음의 두 명령어는 똑같은 결과를 출력합니다.

find . -name \*.pdf -printfind . -name '*.pdf' -print

이의 명령어에 명령어를 추가해보고 결과가 어떻게 바뀌는지 살펴보도록 합시다. 만약 pdfs 디렉토리 내에 있지 않은 pdf 파일만을 찾고자 한다면 어떻게 해야 할까요? 위의 명령어의 결과를 pipe를 통해 grep에게 전달하면 됩니다.

find . -name "*.pdf" -print | grep -v "^\./pdfs/"./2000_ports.pdf

음...위의 명령어는 동작을 합니다만 문법이 꽤 이상해 보입니다. 이를 분석해 보도록 하겠습니다. grep에서 -v는 역필터를 설정하는 옵션입니다. 즉 grep -v 다음에 나오는 것과 반대되는 것을 보여주는 것입니다. 이번 예에서 ./pdfs/에 들어있는 파일들은 필요 없기 때문에 ./pdfs/에 들어 있지 "않은" 파일을 찾아야 했고 그래서 -v 옵션을 사용했습니다. 또 전체 표현식을 인용부호로 감싼 것을 볼 수 있습니다. 그리고 추가적인 문자인 ^\ 를 볼 수 있습니다. ^는 grep에게 표현식이 각 라인의 1열에서부터 일치한 것만을 찾으라고 말하는 것입니다. \는 .를 특별한 문자로 해석하지 못하게 하기 위해 쓰인 추가적인 인용부호입니다. 표현식 전체는 grep에게 ./pdfs/ 디렉토리에 있지 않는 파일들을 보여달라는 것을 의미합니다. 그래서 원하는 결과를 얻었습니다.

용감하게도 좀더 유용하고 복잡한 것을 찾고 있습니까? find는 파일을 찾는 일 뿐만이 아니라 파일을 올바른 디렉토리로 옮기는 일도 할 수 있습니다. 다음의 예제를 살펴보도록 하겠습니다.

find . -name "*.pdf" -print | grep -v "^\./pdfs/" | xargs -J X mv X ./pdfs/

이 명령어가 정확하게 작동했는 지를 알아보기 위해 원래의 find 명령어를 반복하겠습니다.

find . -name "*.pdf" -print./pdfs/50130201a.pdf./pdfs/50130201b.pdf./pdfs/50130201c.pdf./pdfs/IWARLab.pdf./pdfs/DoS_trends.pdf./pdfs/Firewall-Guide.pdf./pdfs/2000_ports.pdf

위에서 볼 수 있듯이 정확하게 동작하였습니다. 왜 그런지 살펴보도록 하겠습니다. 일단 grep은 find 의 결과를 필터링 하였습니다. 그 grep의 결과값이 pipe를 통해 xargs 명령어로 전달이 되었고 우리가 원하는 일이 완료되었습니다. J 스위치는 xargs 명령어에게 stdin으로 들어오는 모든 파일들을 소스로, 명령어 다음에 나오는 파일을 목적지로 가정하게 합니다. 예를 들면 필자가 find 명령을 내리기 전에는 얼마나 많은 파일들을 옮겨야 하는지 알 수 없었습니다. 하나일수도 있고 여러개일수도 있기 때문입니다. 필자는 찾은 파일이 몇개인지 상관없이 xargs가 해당 파일 모두를 pdfs 디렉토리로 옮기게 하고 싶었습니다. 이러한 일종의 마법같은 작업이 J 스위치로 인해 가능합니다. 또한 J 스위치가 올바르게 작동하기 위해서 X라는 문자열을 정의하였고 mv 다음에 삽입하였습니다.

한권으로 끝내는 유닉스
유닉스 파일은 확장자가 없을 수 있다는 것을 기억해야 합니다. 그래서 좀 더 복잡한 패턴에 일치하는 파일을 찾을 수 있어야 합니다. 예를 들면 파일 이름안에 "bsd"가 들어 있는 것을 찾고 싶다면 다음과 같은 명령어를 내리면 됩니다.

find . -name "*bsd*" -print./.kde/share/icons/favicons/www.freebsd.org.png./.kde/share/icons/favicons/www.freebsddiary.org.png./.kde/share/wallpapers/bsdbg1280x1024.jpg./mnwclient-1.11/contrib/freebsd

우리는 물론 파일이름뿐만 아니라 다른 것으로도 파일을 찾을 수 있습니다. 예를 들면, 여러분이 읽은지 30일 이상이 지난 파일들을 찾고자 한다면 다음과 같이 하면 됩니다.

find . -atime +30 -print

수정하지 않은 파일을 찾고자 한다면 -mtime을 사용하면 됩니다. 그리고, 소유권을 변경하지 않은 파일을 찾고자 한다면 -ctime을 사용하면 됩니다. + 다음의 숫자는 날짜를 의미합니다. 오늘 변경된 파일을 찾고자 한다면 다음과 같이 하면 될 것입니다.

find . -mtime -1 -print

이는 24시간내에 수정된 파일을 찾아서 보여줍니다. 이번 예제에서는 하루 이전의 파일에 관심이 있기 때문에 - 옵션을 사용한 것에 주목하시기 바랍니다.

시간에 관한 또다른 스위치는 -newer 입니다. 위에서 알아본 3가지 시간에 관한 스위치는 모두 24시간 단위로만 사용이 가능합니다. 좀 더 작은 시간 단위에서 작업을 하고자 한다면 - newer 스위치를 이용할 수 있습니다. 이를 이용해 1분 단위로 파일의 접근이나 수정, 변경을 비교할 수 있습니다. 예를 들면 여러분이 .cshrc 파일을 수정한 이후에 수정된 .으로 시작하는 파일을 찾고자 한다면, 다음과 같이 하면 됩니다.

find . -type f -name ".*" -newer .cshrc -print

여기에 -type이란 새로운 스위치가 있습니다. 이는 파일의 타입을 지정하는 스위치인데 디렉토리가 아닌 파일만을 찾기 위해 -type f를 추가했습니다. 그리고 -name 스위치를 통해 이름이 .으로 시작하는 파일을 찾고자 했으며 마지막으로 -newer 스위치를 이용해 .cshrc 파일을 수정한 이후에 수정된 파일들을 찾도록 하였습니다.

여러 스위치를 결합해서 사용할때 -o 나 논리 or를 사용하지 않는다면 모든 결과는 논리적인 and 의 결과입니다. 위에서도 모든 스위치가 논리적 and로 결합되어 있기 때문에 find는 이러한 조건(타입이 파일이고 어떤 특정한 이름을 가지고 있고 .cshrc파일보다 이후에 수정된)을 모두 만족하는 것을 찾아줄 것입니다.

논리적 and 와 논리적 or의 차이를 알아보도록 하겠습니다. 만약 필자의 홈디렉토리에 있는 7일이상 접근하지 않고 크기가 10MB이상인 파일을 찾고자 한다면 다음과 같이 하면 됩니다.

find . -atime +7 -size +20480 -print

하지만 만약 7일 이상 접근하지 않은 파일 이거나 크기가 10MB이상인 파일을 찾고자 한다면 다음처럼 해야 합니다.

find . -atime +7 -o -size +20480 -print

여기서 -size 스위치를 사용하기 위해서 약간의 계산이 필요하다는 것을 알 수 있습니다. 이는 -size가 크기를 512바이트 단위로 인식하기 때문입니다. 하지만 다음과 같이 한다면 계산은 필요없습니다.

find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print

위의 예제에서 backquotes(`) 사이에서 우리가 필요로하는 계산을 한다는 것을 주목해야 합니다. (`는 키보드의 가장 왼쪽 상단에 있습니다.) 우리는 10MB 이상의 파일을 찾길 원하기 때문에 backquotes 앞에 +가 여전히 존재합니다. find 명령어 앞에 echo를 더해서 그 결과가 무엇인지 미리 알아볼 수도 있습니다.

echo find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -printfind . -atime +7 -size +20480 -print

위와 같이 복잡한 명령어를 실행할 때에는, backquote를 한 것이 올바른 결과를 출력하는지 등을 미리 검사해 보는 것이 좋은 습관입니다.

드루 라빈은 킹스톤에 있는 사립 공과 대학에서 네트웍을 가르치고 있습니다. 그녀는 하나의 테스트 컴퓨터에서 얼마나 많은 운영체제를 멀티 부팅할 수 있는지 알아보는 것으로 유명합니다.

========================================================


endline _________________________________