메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Linux 학습, 기초 과정: 파일 및 디렉토리 관리

Linux 파일 및 디렉토리에 익숙해지기

Ian Shields, 선임 프로그래머, IBM Japan
Ian Shields 사진
Ian Shields는 developerWorks 리눅스 영역을 위한 리눅스 프로젝트 다수를 수행하고 있다. Shields는 노스 캐롤라이나 주 소재 IBM 리서치 트라이앵글 파크에서 선임 프로그래머로 일한다. Shields는 1973년 시스템 엔지니어로 오스트레일리아, 캔베라에 있는 IBM 사무실에 들어갔으며 캐나다 몬트리얼과 노스 캐롤라이나 주 RTP에서 통신 시스템과 배포 컴퓨팅 부문에서 일해왔다. Shields는 특허 여러 건을 획득했으며, 논문 여러 건을 발표했다. Shields는 순수 수학과 철학 학사 학위를 오스트레일리안 국립 대학에서 받았다. 노스 캐롤라이나 주립 대학에서 컴퓨터 과학 분야를 대상으로 석사와 박사 학위를 받았다. 전자편지 주소는 ishields@us.ibm.com이다.
(An IBM developerWorks Contributing Author)

요약:  Linux에서는 모든 것이 파일로 존재한다는 내용을 들어본 적이 있을 것입니다. 파일과 디렉토리 관리라는 굳건한 토대를 다질 수 있도록 찾기, 목록 작성, 이동, 복사 및 아카이브 등에 대해 학습합니다. 본 기사의 자료를 활용하여 Linux 시스템 관리자 인증을 위한 LPI® 101 시험에 대비한 공부를 하거나 단순히 흥미로 학습할 수도 있습니다.

이 연재 자세히 보기

기사 게재일:  2011 년 10 월 11 일
난이도: 중급 PDF:  A4 and Letter (102KB | 31 pages)Get Adobe® Reader®
페이지뷰:  1426 회
의견:  


이 시리즈의 정보

본 기사 시리즈를 통해 Linux 시스템 관리 작업을 학습할 수 있다. 기사의 자료를 이용해 LPIC-1(Linux Professional Institute Certification 레벨 1) 시험에 대비할 수도 있다.

본 시리즈의 각 기사에 대한 설명과 링크는 시리즈 로드맵을 참조한다. 이 로드맵은 현재 진행 중이며, 최근(2009년 4월)의 LPIC-1 시험 목적을 반영한다. 기사 작성을 완료하면 해당 기사를 로드맵에 추가한다. 한편, LPI 인증 시험 준비 학습서에서는 2009년 4월 이전의 LPIC-1과 관련된 유사한 자료의 이전 버전을 찾을 수 있다.

선수조건

본 시리즈에 수록된 기사를 최대한 활용하려면 Linux에 대한 기본적인 지식과 이 기사에서 다루는 명령을 실습할 수 있는 Linux 시스템이 있어야 한다. 때때로 같은 프로그램이라도 버전이 다르면 출력 형식이 다르므로, 실습 결과가 이 기사에서 보여주는 목록 및 그림과 항상 정확히 같지는 않을 수도 있다.

개요

이 기사는 파일 및 디렉토리 조작을 위한 기본 Linux 명령에 대한 기초 지식을 제공한다. 그 내용은 다음과 같다.

  • 디렉토리 컨텐츠 표시
  • 파일 및 디렉토리 복사, 이동 또는 제거
  • 복수의 파일 및 디렉토리를 반복적으로 조작
  • 와일드카드 패턴을 사용하여 파일 조작
  • find 명령을 사용하여 유형, 크기 또는 시간에 따라 파일을 찾아 작업 수행
  • gzipbzip2 명령을 사용하여 파일 압축 및 압축 풀기
  • tar, cpiodd를 사용하여 파일 아카이브

이 기사는 Linux Professional Institute의 Junior Level Administration(LPIC-1) 기초 과정 시험 중 Topic 103에 있는 Objective 103.2를 대비하는 데 도움이 된다. 이 목표의 가중치는 4이다.


디렉토리 나열

Linux와 UNIX® 시스템에서 모든 파일을 /를 루트로 하는 하나의 대규모 트리의 일부로 액세스된다. 마운트를 통해 이 트리에 가지를 더 추가하거나 마운트 해제를 통해 가지를 제거할 수도 있다. 마운트와 마운트 해제는 파일 시스템 마운트 및 마운트 해제 기사에서 다룰 예정이다. (시리즈 로드맵을 참조하자.)

디렉토리 항목 나열

이 기사에서는 Learn Linux 101: 텍스트 스트림과 필터" 기사에서 작성한 파일을 사용하여 명령에 대해 학습하게 된다. 해당 기사의 내용을 따라했다면 홈 디렉토리에 lpi103-2 디렉토리가 작성되었을 것이다. 디렉토리가 없다면 시스템의 다른 디렉토리로도 이 기사에서 논의할 명령을 연습해 볼 수 있다.

파일과 디렉토리 이름은 /로 시작할 경우 절대 파일 또는 디렉토리이고 /로 시작하지 않을 경우 현재 작업 디렉토리에 대한 상대 파일 또는 디렉토리이다. 파일 또는 디렉토리에 대한 절대 경로는 /가 맨 앞에 오고 그 뒤에 0개 이상의 디렉토리 이름이 오며 각 디렉토리 이름 뒤에는 다시 /가 오고 맨 뒤에 최종 이름이 온다.

현재 작업 디렉토리에 대한 상대 경로 파일 또는 디렉토리 이름이 제공될 경우 작업 디렉토리의 절대 이름과 / 그리고 상대 이름을 연결하면 된다. 예를 들어 이전 기사에서 작성한 lpi103-2 디렉토리는 필자의 홈 디렉토리인 /home/ian에 작성되었으므로, 이 디렉토리의 전체 또는 절대 경로는 /home/ian/lpi103-2이다.

현재 작업 디렉토리의 이름은 pwd 명령으로 표시할 수 있다. 보통 PWD 환경 변수에서도 이를 사용할 수 있다. 목록 1에는 pwd 명령의 사용과 ls 명령으로 이 디렉토리에 있는 파일을 나열하는 세 가지 방법이 나와 있다.


목록 1. 디렉토리 항목 나열
                    
[ian@echidna lpi103-2]$ pwd
/home/ian/lpi103-2
[ian@echidna lpi103-2]$ echo "$PWD"
/home/ian/lpi103-2
[ian@echidna lpi103-2]$ ls
sedtab  text1  text2  text3  text4  text5  text6  xaa  xab  yaa  yab
[ian@echidna lpi103-2]$ ls "$PWD"
sedtab  text1  text2  text3  text4  text5  text6  xaa  xab  yaa  yab
[ian@echidna lpi103-2]$ ls /home/ian/lpi103-2
sedtab  text1  text2  text3  text4  text5  text6  xaa  xab  yaa  yab

보이는 바와 같이 ls 명령의 매개변수로 상대 또는 절대 디렉토리 이름을 제공할 수 있으며, 이에 따라 해당 디렉토리의 컨텐츠가 나열된다.

세부사항 나열

스토리지 장치에서는 파일이나 디렉토리가 블록 콜렉션에 포함되어 있다. 파일 정보는 inode에 포함되며 inode에는 파일 소유자, 파일이 마지막으로 액세스된 시점, 파일의 크기, 파일 유형(디렉토리 또는 파일), 파일에 대한 읽기 및 쓰기 권한정보가 기록된다. inode 번호는 파일의 일련 번호에 해당하며 특정 파일 시스템에서는 유일하다. -l(또는 --format=long) 옵션을 사용하여 inode에 저장된 정보 중 일부를 표시할 수 있다.

기본적으로 ls 명령은 점(.)으로 이름이 시작하는 특수 파일을 나열하지 않는다. 루트 디렉토리를 제외한 다른 디렉토리에는 적어도 두 개의 특수 항목이 포함되어 있는데, 그 중 하나는 디렉토리 자체(.)이고 나머지 하나는 상위 디렉토리(..)이다. 루트 디렉토리에는 상위 디렉토리가 없다.

목록 2는 -l-a 옵션을 사용하여 . 및 .. 디렉토리 항목을 포함한 모든 파일을 긴 형식의 목록으로 표시한다.


목록 2. 긴 디렉토리 목록 표시

                    
[ian@echidna lpi103-2]$ ls -al
total 52
drwxrwxr-x.  2 ian ian 4096 2009-08-11 21:21 .
drwx------. 35 ian ian 4096 2009-08-12 10:55 ..
-rw-rw-r--.  1 ian ian    8 2009-08-11 21:17 sedtab
-rw-rw-r--.  1 ian ian 24 2009-08-11 14:02 text1
-rw-rw-r--. 1 ian ian   25 2009-08-11 14:27 text2
-rw-rw-r--.  1 ian ian   63 2009-08-11 15:41 text3
-rw-rw-r--.  1 ian ian   26 2009-08-11 15:42 text4
-rw-rw-r--.  1 ian ian   24 2009-08-11 18:47 text5
-rw-rw-r--.  1 ian ian   98 2009-08-11 21:21 text6
-rw-rw-r--.  1 ian ian   15 2009-08-11 14:41 xaa
-rw-rw-r--.  1 ian ian    9 2009-08-11 14:41 xab
-rw-rw-r--.  1 ian ian   17 2009-08-11 14:41 yaa
-rw-rw-r--.  1 ian ian    8 2009-08-11 14:41 yab

목록 2에서 첫 번째 행은 나열된 파일에서 사용하는 디스크 블록의 총 수(52)를 나타낸다. 나머지 행은 디렉토리 항목에 대한 정보를 보여준다.

  • 첫 번째 필드(여기서는 drwxrwxr-x 또는 -rw-rw-r--)는 파일이 디렉토리(d)인지 또는 정규 파일(-)인지를 나타낸다. 일부 특수 파일(예: /dev 파일 시스템의 파일)에 대한 기호 링크(l) 또는 다른 값을 확인할 수도 있다. 기호 링크에 대한 자세한 내용은 하드 링크와 기호 링크의 작성 및 변경 기사에서 학습할 수 있다(시리즈 로드맵 참조). 유형 뒤에는 소유자, 소유자 그룹의 멤버 및 모든 사용자에 대해 세 가지 권한 세트(예: rwx 또는 r--)가 표시된다. 세 값은 각각 사용자, 그룹 또는 모든 사용자가 읽기(r), 쓰기(w) 또는 실행(x) 권한을 보유하고 있는지 여부를 나타낸다. setuid 등 다른 사용 방법은 파일 권한 및 소유권 관리하기 기사에서 다루어진다(시리즈 로드맵 참조).
  • 다음 필드는 파일에 대한 하드 링크의 수를 알려주는 숫자이다. inode에는 파일에 대한 정보가 담겨 있다는 것은 이미 언급한 적이 있다. 파일의 디렉토리 항목에는 파일의 inode에 대한 하드 링크(또는 포인터)가 포함되어 있으므로 나열된 모든 항목은 적어도 하나의 하드 링크를 포함한다. 디렉토리 항목에는 . 항목에 대해 하나의 추가 하드 링크와 각 서브디렉토리에 대해 하나의 하드 링크가 포함된다. 따라서 우리는 목록 2에서 ..으로 표시되는 내 홈 디렉토리에 35개의 하드 링크가 있다고 표시되는 것으로 보아 서브디렉토리가 다수 포함되어 있음을 알 수 있다.
  • 다음 두 필드는 파일의 소유자와 소유자의 기본 그룹을 나타낸다. Red Hat이나 Fedora 시스템과 같은 몇몇 시스템에서는 각 사용자에 대해 별도의 그룹이 기본적으로 제공된다. 다른 시스템의 경우 모든 사용자가 하나 또는 아마도 적은 수의 그룹에 속할 것이다.
  • 다음 필드는 파일 길이를 바이트 단위로 나타낸다.
  • 끝에서 두 번째 필드는 마지막으로 수정된 시간소인을 보여준다.
  • 마지막 필드에는 파일 또는 디렉토리의 이름이 포함된다.

ls 명령의 -i 옵션은 사용자의 inode 번호를 표시할 것이다. inodes에 대해서는 이 기사의 후반부에서 다시 다룰 예정이며 하드 링크와 기호 링크의 작성 및 변경 기사에서도 볼 수 있다(시리즈 로드맵 참조).

다중 파일

각각의 이름이 파일 또는 디렉토리 이름인 여러 매개변수를 ls 명령에 지정할 수도 있다. 디렉토리 이름을 매개변수로 지정할 경우 ls 명령은 디렉토리 자체의 정보가 아닌 디렉토리의 컨텐츠를 나열한다. 이 예에서는 상위 디렉토리에 lpi103-2 디렉토리 항목이 나열되어 있기 때문에 lpi103-2 디렉토리 항목에 관한 정보가 필요한 것으로 가정하자. ls -l ../lpi103-2 명령을 사용하면 이전의 예와 유사한 목록을 제공한다. 목록 3은 -d 옵션을 추가하여 디렉토리의 컨텐츠가 아닌 디렉토리 항목에 대한 정보를 나열하는 방법 및 여러 개의 파일 또는 디렉토리에 대한 항목을 나열하는 방법도 보여준다.


목록 3. ls -d 사용
                    
[ian@echidna lpi103-2]$ ls -ld ../lpi103-2 sedtab xaa
drwxrwxr-x. 2 ian ian 4096 2009-08-12 15:31 ../lpi103-2
-rw-rw-r--. 1 ian ian    8 2009-08-11 21:17 sedtab
-rw-rw-r--. 1 ian ian   15 2009-08-11 14:41 xaa

lpi103-2의 수정 시간은 이전 목록에서의 수정 시간과 다르다는 점에 유의하자. 또한 이전 목록에서와 같이 디렉토리의 어떠한 파일과도 시간소인이 일치하지 않는다. 예상한 바와 일치하는가? 보통은 그렇지 않을 것이다. 그러나 이 기사를 쓰면서 저자는 몇몇 다른 예제를 작성한 다음 삭제했기 때문에 디렉토리 시간소인이 이같은 사실을 반영하는 것이다. 파일 시간에 대해서는 다중 파일 및 디렉토리 처리에서 좀 더 이야기를 나눠 볼 것이다.

출력 정렬

기본적으로 ls 명령은 파일을 알파벳순으로 나열한다. 출력은 다양한 옵션을 통해 정렬이 가능하다. 예를 들어, ls -t는 수정 시간별(가장 최신이 가장 먼저)로 정렬되고 ls -lS는 크기별로 정렬(가장 큰 파일이 가장 먼저)된 긴 목록을 생성한다. -r을 추가하면 정렬 순서가 반대가 된다. 예를 들어 ls -lrt를 사용하면 가장 오래된 파일에서 가장 최신 파일 순으로 정렬된 긴 목록이 생성된다. 파일과 디렉토리를 나열할 수 있는 다른 방법은 매뉴얼 페이지를 참고하자.


파일 복사, 이동 및 삭제

이제까지 우리는 파일을 작성하는 몇 가지 방법에 대해 학습했지만, 이번에는 파일의 사본을 만들고 파일의 이름을 바꾸고 파일 시스템 계층 구조 내에서 파일을 이동해야 한다고 가정해 보자. 우리는 이를 위해 세 가지 간단한 명령을 사용한다.

cp
하나 이상의 파일 또는 디렉토리의 사본을 만드는 데 사용된다. 명령 사용 시 반드시 하나(또는 그 이상)의 소스 이름과 하나의 대상 이름을 제공해야 한다. 소스 또는 대상 이름은 경로 스펙을 포함할 수 있다. 대상이 기존 디렉토리이면 모든 소스는 대상 디렉토리 안으로 복사된다. 대상이 기존에 존재하지 않는 디렉토리라면 (단일) 소스도 반드시 디렉토리여야 하고 소스 디렉토리와 그에 속한 컨텐츠의 사본은 새 이름을 사용하여 대상 이름으로 만들어진다. 대상이 파일인 경우에는 (단일) 소스도 파일이어야 하며 소스 파일의 사본은 새 이름을 사용하여 대상 이름으로 만들어지고 이름이 같은 기존 파일을 대체한다. DOS와 Windows 운영 체제에서는 대상이 현재 디렉토리라고 기본적으로 가정되지 않음에 유의하자.
mv
하나 이상의 파일 또는 디렉토리를 이동 또는 이름 바꾸기 하는데 사용된다. 일반적으로, 사용할 수 있는 이름은 cp를 사용하여 복사할 때와 같은 규칙을 따른다. 단일 파일의 이름을 바꾸거나 파일 세트를 새 디렉토리로 이동할 수 있다. 이름은 단지 inode에 연결된 디렉토리 항목이기 때문에, 파일이 다른 파일 시스템으로 이동하지 않는 한 inode 번호는 바뀌지 않으며, 다른 파일 시스템으로 이동될 경우에는 복사 후 원본 파일을 삭제하는 것과 흡사하게 작동한다.
rm
하나 이상의 파일을 제거하는 데 사용된다. 디렉토리를 제거하는 방법에 대해서도 곧 알아볼 것이다.

rename 명령은 언제 사용할까?

DOS 또는 Windows® 시스템 사용자라면 mv를 사용하여 파일의 이름을 바꾸는 데 어색함을 느낄 수 있다. Linux에도 rename 명령이 있지만 DOS 또는 Windows에서의 rename 명령과는 다르게 구문이 사용된다. 이에 대해서는 매뉴얼 페이지를 참조하자.

목록 4는 cpmv를 사용하여 텍스트 파일의 백업 사본을 만드는 방법을 보여준다. 우리가 사용하는 파일 중 일부에서는 ls -i로 inode를 표시할 수도 있다.

  1. 먼저 text1 파일의 사본을 text1.bkp라고 만든다.
  2. 그 다음 mkdir 명령을 사용하여 백업 서브디렉토리를 작성하기로 하자.
  3. 이번에는 백업 디렉토리에서 text1의 두 번째 백업 사본을 만들고 세 파일 모두 다른 inode를 포함하도록 표시한다.
  4. 그리고는 text1.bkp를 백업 디렉토리로 옮긴 후에 두 번째 백업과의 일관성을 유지하도록 이름을 바꾼다. 하나의 명령으로 모두 수행할 수 있지만 여기에서는 알아보기 쉽도록 명령을 두 번 사용한다.
  5. inodes를 다시 확인하여 inode가 934193인 text1.bkp가 더 이상 lpi103-2 디렉토리에 존재하지 않지만 해당 inode가 백업 디렉토리의 text1.bkp.1의 inode임을 확인한다.

목록 4. 파일 복사 및 이동
                    
[ian@echidna lpi103-2]$ cp text1 text1.bkp
[ian@echidna lpi103-2]$ mkdir backup
[ian@echidna lpi103-2]$ cp text1 backup/text1.bkp.2
[ian@echidna lpi103-2]$ ls -i text1 text1.bkp backup
933892 text1  934193 text1.bkp

backup:
934195 text1.bkp.2
[ian@echidna lpi103-2]$ mv text1.bkp backup
[ian@echidna lpi103-2]$ mv backup/text1.bkp backup/text1.bkp.1
[ian@echidna lpi103-2]$ ls -i text1 text1.bkp backup
ls: cannot access text1.bkp: No such file or directory
933892 text1

backup:
934193 text1.bkp.1  934195 text1.bkp.2

일반적으로 cp 명령은 기존 파일에 쓰기가 가능할 경우 파일을 기존 사본 위에 복사한다. 반대로, mv는 대상이 존재할 경우 파일을 이동하거나 파일의 이름을 바꾸지 않는다. cpmv의 이러한 작동에 관한 여러 유용한 옵션이 존재한다.

-f 또는 --force
이 옵션을 지정하면 cp 명령에서 기존의 대상 파일이 쓰기 가능하지 않더라도 대상 파일을 제거한다.
-i 또는 --interactive
기존 파일을 대체하기 전에 확인 메시지를 표시한다.
-b 또는 --backup
대체되는 모든 파일의 백업을 작성한다.

이들 옵션 및 복사 및 이동과 관련된 다른 옵션에 대한 세부사항은 매뉴얼 페이지를 참조하자.

목록 5는 복사 및 백업을 수행한 다음 파일을 삭제하는 내용을 보여준다.


목록 5. 백업 사본 작성 및 파일 삭제
                    
[ian@echidna lpi103-2]$ cp text2 backup
[ian@echidna lpi103-2]$ cp --backup=t text2 backup
[ian@echidna lpi103-2]$ ls backup
text1.bkp.1  text1.bkp.2  text2  text2.~1~
[ian@echidna lpi103-2]$ rm backup/text2 backup/text2.~1~
[ian@echidna lpi103-2]$ ls backup
text1.bkp.1  text1.bkp.2

rm 명령에 -i(대화식) 및 -f(강제 실행 옵션)도 허용된다는 점에 유의하자. 일단 rm을 사용하여 파일을 제거하고 나면 파일 시스템에는 더 이상 해당 파일에 대한 액세스 권한이 없다. 일부 시스템은 루트 사용자에 대해 기본값으로 별명을 설정하여(alias rm='rm -i') 부주의로 인한 파일 삭제를 방지한다. 의도하지 않게 삭제하는 경우가 발생할까 우려하는 일반 사용자에게 좋은 방법이 될 것이다.

이 논의를 마치기 전에 한 가지 짚고 넘어가야 할 것은, cp 명령은 기본적으로 하나 또는 그 이상의 새 파일에 대해 시간소인을 새로 작성한다는 것이다. 소유자 및 그룹은 복사를 수행 중인 사용자의 그룹 및 소유자로도 설정된다. -p 옵션은 선택한 속성을 유지하는 데 사용할 수 있다. 루트 사용자는 소유권을 유지할 수 있는 유일한 사용자임을 잊지 말자. 세부사항은 매뉴얼 페이지를 참조한다.


디렉토리 작성 및 제거

mkdir 명령으로 디렉토리를 작성하는 방법은 이미 알아 보았다. 이번에는 mkdir에 대해 좀 더 자세히 알아보고, 디렉토리를 삭제하는 데 사용되는 rmdir에 대해서도 알아보자.

Mkdir

우리가 현재 위치한 디렉토리가 lpi103-2이고 서브디렉토리인 dir1 및 dir2를 작성하려 한다고 가정한다. mkdir도 우리가 이제껏 검토해온 명령과 마찬가지로 목록 6에서 보이는 바와 같이 한 번에 여러 디렉토리 작성을 처리할 수 있다.


목록 6. 다중 디렉토리 작성
                    
[ian@echidna lpi103-2]$ mkdir dir1 dir2

정상적으로 완료된 출력은 아니지만 echo $?를 사용하면 종료 코드가 실제로 0인지 확인할 수 있다.

대신 d1/d2/d3과 같은 중첩된 서브디렉토리를 작성하려고 하는 경우에는 d1 및 d2 디렉토리가 존재하지 않기 때문에 명령이 실패한다. 다행히도, mkdir에는 -p 옵션이 있어 필요한 임의의 상위 디렉토리를 목록 7에서와 같이 작성할 수 있다.


목록 7. 상위 디렉토리 작성
                    
[ian@echidna lpi103-2]$ mkdir d1/d2/d3
mkdir: cannot create directory `d1/d2/d3': No such file or directory
[ian@echidna lpi103-2]$ echo $?
1
[ian@echidna lpi103-2]$ mkdir -p d1/d2/d3
[ian@echidna lpi103-2]$ echo $?
0

Rmdir

rmdir 명령으로 디렉토리를 제거하는 것은 디렉토리 작성과 반대되는 개념이다. 다시 말해 -p 옵션을 사용하면 상위 디렉토리도 제거된다. rmdir 명령에는 강제로 제거하는 옵션이 없기 때문에 해당 디렉토리가 비어 있어야만 제거할 수 있다. 비어 있지 않은 디렉토리를 제거하는 다른 방법은 반복적 조작에서 살펴본다. 이 방법을 알게되면 명령행에서 rmdir은 거의 사용하지 않게 되겠지만 일단 알아둬서 나쁠건 없다.

디렉토리 제거에 대해 설명하기 위해 text1 파일을 디렉토리 d1/d2에 복사했기 때문에 디렉토리는 더 이상 비어 있지 않다. rmdir을 사용하여 우리가 방금 mkdir로 만든 모든 디렉토리를 제거했다. 보이는 바와 같이 d2가 비어 있지 않기 때문에 d1 및 d2는 제거되지 않았다. 다른 디렉토리는 제거되었다. d2에서 text1을 제거하고 나면 rmdir -p를 한 번 호출하여 d1과 d2를 제거할 수 있다.


목록 8. 디렉토리 제거
                    
[ian@echidna lpi103-2]$ cp text1 d1/d2
[ian@echidna lpi103-2]$ rmdir -p d1/d2/d3 dir1 dir2
rmdir: failed to remove directory `d1/d2': Directory not empty
[ian@echidna lpi103-2]$ ls . d1/d2
.:
backup  sedtab  text2  text4  text6  xab  yab
d1      text1   text3  text5  xaa    yaa

d1/d2:
text1
[ian@echidna lpi103-2]$ rm d1/d2/text1
[ian@echidna lpi103-2]$ rmdir -p d1/d2


다중 파일 및 디렉토리 처리

이제까지 우리가 사용한 명령들은 하나의 파일 또는 몇 개의 개별적으로 이름 지정된 파일에 대해 작동했다. 이 기사의 나머지 부분에서는 여러 파일을 처리하고, 디렉토리 트리의 일부를 반복적으로 조작하고, 여러 파일 또는 디렉토리를 저장 또는 복원하는 다양한 작동 방법을 살펴볼 것이다.


반복적 조작

반복적 나열

ls 명령에는 디렉토리와 모든 서브디렉토리를 나열하는 -R(대문자 "R"임에 주의) 옵션이 있다. 반복 옵션은 디렉토리 이름에만 적용되며 디렉토리 트리에서 예를 들어 'text1'과 같은 모든 파일은 찾지 않는다. -R과 함께 이미 살펴본 다른 옵션은 사용할 수 있다. inode 번호를 포함한 lpi103-2 디렉토리의 반복적 나열이 목록 9에 나와 있다.


목록 9. 반복적으로 디렉토리 목록 표시
                    
[ian@echidna lpi103-2]$ ls -iR
.:
934194 backup  933892 text1  933898 text3  933900 text5  933894 xaa  933896 yaa
933901 sedtab  933893 text2  933899 text4  933902 text6  933895 xab  933897 yab

./backup:
934193 text1.bkp.1  934195 text1.bkp.2

반복적 복사

-r(또는 -R 또는 --recursive) 옵션을 사용하면 cp 명령은 소스 디렉토리를 따라 내려오면서 컨텐츠를 반복적으로 복사한다. 무한 반복을 방지하려면 소스 디렉토리 자체는 복사하지 않아야 한다. 목록 10은 lpi103-2 디렉토리의 모든 컨텐츠를 copy1 서브디렉토리로 복사하는 방법을 보여준다. ls -R을 통해 결과 디렉토리 트리를 표시한다.


목록 10. 반복적으로 복사
                    
[ian@echidna lpi103-2]$ cp -pR . copy1
cp: cannot copy a directory, `.', into itself, `copy1'
[ian@echidna lpi103-2]$ ls -R
.:
backup  copy1  sedtab  text1  text2  text3  text4  text5  text6  xaa  xab  yaa  yab

./backup:
text1.bkp.1  text1.bkp.2

./copy1:
text2  text3  text5  xaa  yaa  yab

반복적 삭제

앞에서 우리는 rmdir이 비어 있는 디렉토리만 제거한다는 사실을 언급했었다. -r(또는 -R 또는 --recursive) 옵션을 사용하면 rm 명령이 목록 11에서 보이는 바와 같이 파일 디렉토리 모두를 제거한다. 방금 만든 copy1 디렉토리를 제거하고 백업 서브디렉토리와 그에 속한 컨텐츠를 포함하여 copy1 디렉토리의 컨텐츠도 함께 제거한다.


목록 11. 반복적으로 삭제
                    
[ian@echidna lpi103-2]$ rm -r copy1
[ian@echidna lpi103-2]$ ls -R
.:
backup  sedtab  text1  text2  text3  text4  text5  text6  xaa  xab  yaa  yab

./backup:
text1.bkp.1  text1.bkp.2

사용자에게 쓰기 권한이 없는 파일을 보유하고 있는 경우, 강제 제거를 위해 -f 옵션을 추가할 수 있다. 루트 사용자가 정리 시 종종 이 옵션을 사용하지만 주의하지 않을 경우 소중한 데이터를 잃을 수 있다는 경고가 표시된다.


와일드카드 및 글로빙(globbing)

많은 파일 시스템 오브젝트에서 반복 조작에서 방금 수행한 것과 같이 전체 트리에서 조작하지 않고 단일 조작을 수행해야 하는 경우가 종종 발생한다. 예를 들어, 분할 파일은 나열하지 않으면서 lpi103-2에서 작성한 모든 텍스트 파일의 수정 시간을 찾아보고 싶을 수 있다. 이는 소규모 디렉토리에서는 쉬울지 몰라도 대형 파일 시스템에서는 무척 어려운 일이다.

이 문제를 해결하려면 Bash 쉘에서 구축된 와일드카드 지원을 사용한다. 원래 /etc/glob라고 하는 프로그램으로 구현되었기 때문에 이 와일드카드 지원을 "글로빙(globbing)"이라고도 하며, 와일드카드 패턴을 사용하여 여러 파일을 지정할 수 있게 해준다.

'?', '*' 또는 '[' 문자 중 하나를 포함한 문자열이 와일드카드 패턴이다. 글로빙은 쉘(또는 다른 프로그램도 가능)에서 해당 패턴과 일치하는 경로 이름 목록으로 패턴을 펼치는 프로세스이다. 일치는 다음과 같이 수행된다.

?
임의의 단일 문자와 일치한다.
*
비어 있는 문자열을 포함한 모든 문자열과 일치한다.
[
문자 클래스를 시작한다. 문자 클래스는 비어 있지 않은 문자열이며 ']'로 끝난다. 일치한다는 것은 대괄호로 묶인 임의의 단일 문자와의 일치를 의미한다. 특별히 고려해야 할 몇 가지는 다음과 같다.
  • '*' 및 '?' 문자는 동일한 문자와의 일치도 검색한다. 이 문자를 파일 이름에 사용하려면 적절히 따옴표로 묶거나 이스케이프할 방법을 고려해야 한다.
  • 문자열은 비어 있지 않아야 하고 ']'로 끝나야 하기 때문에 일치시키려면 문자열에 ']'를 먼저 입력해야 한다.
  • 두 문자 사이의 '-' 문자는 두 개의 다른 문자를 포함하고 두 문자 사이의 모든 문자를 조합 순서로 하는 범위를 나타낸다. 예를 들어, [0-9a-fA-F]는 모든 대문자 또는 소문자 16진수를 나타낸다. '-'를 범위 안의 처음 또는 끝에 넣어 일치시킬 수 있다.
  • '!' 문자가 범위의 첫 번째 문자로 지정되면 남은 문자를 제외한 모든 문자와 일치하도록 범위를 보완한다. 예를 들어, [!0-9]는 0에서 9싸지의 숫자를 제외한 모든 문자를 의미한다. '!' 문자의 위치가 맨 첫음이 아닐 경우에는 그 자신과 일치한다. '!'는 또한 쉘 히스토리 기능에도 사용되므로 적절히 이스케이프하도록 주의를 기울여야 한다.

참고: 와일드카드 패턴과 정규식 패턴은 몇몇 특성을 공유하지만 동일한 것은 아니다. 이 점에 주의하자.

글로빙은 경로 이름의 컴포넌트 각각에 개별적으로 적용된다. '/'는 범위에서 일치하거나 포함할 수 없다. 여러 파일 또는 디렉토리 이름을 지정하는 곳에서는 어디든 사용할 수 있다(예: ls, cp, mv 또는 rm 명령). 목록 12에서는 먼저 특이한 이름의 파일을 몇 개 만든 다음 lsrm 명령을 와일드카드 패턴과 함께 사용한다.


목록 12. 와일드카드 패턴 예제
                    
[ian@echidna lpi103-2]$ echo odd1>'text[*?!1]'
[ian@echidna lpi103-2]$ echo odd2>'text[2*?!]'
[ian@echidna lpi103-2]$ ls
backup  text1       text2       text3  text5  xaa  yaa
sedtab  text[*?!1]  text[2*?!]  text4  text6  xab  yab
[ian@echidna lpi103-2]$ ls text[2-4]
text2  text3  text4
[ian@echidna lpi103-2]$ ls text[!2-4]
text1  text5  text6
[ian@echidna lpi103-2]$ ls text*[2-4]*
text2  text[2*?!]  text3  text4
[ian@echidna lpi103-2]$ ls text*[!2-4]* # Surprise!
text1  text[*?!1]  text[2*?!]  text5  text6
[ian@echidna lpi103-2]$ ls text*[!2-4] # Another surprise!
text1  text[*?!1]  text[2*?!]  text5  text6
[ian@echidna lpi103-2]$ echo text*>text10
[ian@echidna lpi103-2]$ ls *\!*
text[*?!1]  text[2*?!]
[ian@echidna lpi103-2]$ ls *[x\!]*
text1  text[*?!1]  text10  text2  text[2*?!]  text3  text4  text5  text6  xaa  xab
[ian@echidna lpi103-2]$ ls *[y\!]*
text[*?!1]  text[2*?!]  yaa  yab
[ian@echidna lpi103-2]$ ls tex?[[]*
text[*?!1]  text[2*?!]
[ian@echidna lpi103-2]$ rm tex?[[]*
[ian@echidna lpi103-2]$ ls *b*
sedtab  xab  yab

backup:
text1.bkp.1  text1.bkp.2
[ian@echidna lpi103-2]$ ls backup/*2
backup/text1.bkp.2
[ian@echidna lpi103-2]$ ls -d .*
.  ..

참고:

  1. '*'를 사용하여 보완할 경우 예상과 다른 결과가 나타날 수 있다. '*[!2-4]' 패턴은 2, 3 또는 4가 뒤에 오지 않는 이름의 가장 긴 부분과 일치하며 text[*?!1] 및 text[2*?!]와 모두 일치한다. 그러므로 명확히 해주어야 한다.
  2. ls의 이전의 예에서 패턴 펼치기 결과가 디렉토리 이름이고 -d 옵션이 지정되지 않은 경우, 디렉토리의 컨텐츠가 나열된다(패턴 '*b*'에 대한 위의 예 참조).
  3. 파일 이름이 마침표(.)로 시작하는 경우, 해당 문자는 반드시 명시적으로 일치해야 한다. 마지막 ls 명령만이 두 개의 특수 디렉토리 항목(. 및 ..)을 나열했던 것을 염두에 두자.

명령에 사용되는 모든 와일드카드 문자는 쉘에서 펼치기가 쉬워 예상치 못한 결과로 이어질 수 있다는 점을 기억하자. 또한, 파일 시스템 오브젝트와 일치하지 않는 패턴을 지정하면 POSIX에서 최초의 패턴 문자열이 명령으로 전달되도록 요청한다. 일부 이전의 구현에서 널 목록을 명령에 전달했으므로 비정상 작동을 제공하는 이전 스크립트를 실행할 수 있다. 이같은 내용을 목록 13에서 보여준다.


목록 13. 와일드카드 패턴의 예상치 못한 결과
                    
[ian@echidna lpi103-2]$ echo text*
text1 text10 text2 text3 text4 text5 text6
[ian@echidna lpi103-2]$ echo "text*"
text*
[ian@echidna lpi103-2]$ echo text[[\!?]z??
text[[!?]z??

글로빙에 대한 자세한 정보는 man 7 glob를 참조한다. 섹션 3에도 글로브 정보가 나오기 때문에 섹션 번호를 알아야 한다. 다양한 쉘 상호작용을 모두 이해하는 가장 좋은 방법은 연습이다. 그러므로 이러한 와일드카드를 기회가 있을 때마다 시도해 보자. cp, mv 또는 rm으로 예상치 못한 상황을 마주하기 전에 ls로 와일드카드 패턴을 먼저 점검하는 것이 좋다.


파일 터치(touch)

이번에는 파일 액세스 권한을 업데이트하고 시간을 수정하고 빈 파일을 작성하는 touch 명령에 대해 살펴본다. 다음 단락에서는 이 정보를 사용해 파일과 디렉토리를 찾는 방법에 대해 알아볼 것이다. 예제에서는 계속 lpi103-2 디렉토리를 사용한다. 시간소인을 지정하는 다양한 방법에 대해서도 살펴볼 것이다.

touch

touch 명령을 옵션 없이 사용하면 하나 이상의 파일 이름을 매개변수로 선택하고 파일의 수정 시간을 업데이트한다. 이 시간소인은 긴 디렉토리 목록에 표시되는 것과 동일한 시간소인이다. 목록 14에서는 우리에게 친숙한 echo를 사용하여 f1이라고 하는 작은 파일을 작성한 다음 긴 디렉토리 목록으로 수정 시간(또는 mtime)을 표시한다. 이 경우, 파일이 작성된 시간이 표시된다. 그런 다음 sleep 명령으로 60초간 기다린 뒤에 ls 명령을 다시 실행한다. 파일의 시간소인이 1분 변경된 것을 확인한다.


목록 14. touch 명령으로 수정 시간 업데이트
                    
[ian@echidna lpi103-2]$ echo xxx>f1; ls -l f1; sleep 60; touch f1; ls -l f1
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:24 f1
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1

존재하지 않는 파일에 대해 파일 이름을 지정하면 -c 또는 --no-create 옵션을 지정하지 않을 경우 touch는 보통 비어 있는 파일을 작성한다. 목록 15는 이러한 명령을 둘 다 보여준다. f2만 작성된 것을 확인한다.


목록 15. touch 명령으로 비어 있는 파일 작성
                    
[ian@echidna lpi103-2]$ touch f2; touch -c f3; ls -l f*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2

touch 명령은 또한 -d 또는 -t 옵션 중 하나를 사용하여 특정 날짜 및 시간으로 파일의 수정 시간을 설정할 수도 있다(mtime으로도 알려져 있음). -d 옵션은 허용되는 날짜 및 시간 형식이 매우 유연한 반면 -t 옵션은 적어도 MMDDhhmm 시간과 선택적으로 연도 및 초 값을 필요로 한다. 목록 16에 몇 가지 예제가 나와 있다.


목록 16. touch 명령으로 mtime 설정
                    
[ian@echidna lpi103-2]$ touch -t 200908121510.59 f3
[ian@echidna lpi103-2]$ touch -d 11am f4
[ian@echidna lpi103-2]$ touch -d "last fortnight" f5
[ian@echidna lpi103-2]$ touch -d "yesterday 6am" f6
[ian@echidna lpi103-2]$ touch -d "2 days ago 12:00" f7
[ian@echidna lpi103-2]$ touch -d "tomorrow 02:00" f8
[ian@echidna lpi103-2]$ touch -d "5 Nov" f9
[ian@echidna lpi103-2]$ ls -lrt f*
-rw-rw-r--. 1 ian ian 0 2009-07-31 18:31 f5
-rw-rw-r--. 1 ian ian 0 2009-08-12 12:00 f7
-rw-rw-r--. 1 ian ian 0 2009-08-12 15:10 f3
-rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 f6
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 f4
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 f2
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 f8
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 f9

어떤 날짜 및 날짜 표현식을 사용해야 할지 확실하지 않다면 date 명령으로 찾을 수 있다. date 명령에서도 -d 옵션이 허용되며 touch에서 해석할 수 있는 것과 동일한 종류의 날짜 형식을 해석할 수 있다.

-r(또는 --reference) 옵션을 참조 파일 이름과 함께 사용하여 touch(또는 date) 명령이 기존 파일의 시간소인을 사용해야 함을 표시할 수 있다. 목록 17에 몇 가지 예제가 나와 있다.


목록 17. 참조 파일의 시간소인

                    
[ian@echidna lpi103-2]$ date
Fri Aug 14 18:33:48 EDT 2009
[ian@echidna lpi103-2]$ date -r f1
Fri Aug 14 18:25:50 EDT 2009
[ian@echidna lpi103-2]$ touch -r f1 f1a
[ian@echidna lpi103-2]$ ls -l f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a

Linux 시스템은 파일 수정 시간과 파일 액세스 시간을 모두 기록한다. 이들은 각각 mtimeatime으로도 알려져 있다. 파일 작성 시 두 시간소인은 모두 동일한 값으로 설정되고 수정 시 둘 다 다시 설정된다. 파일이 액세스되면 파일이 수정되지 않더라도 액세스 시간이 업데이트된다. touch에 대한 앞의 예에서 액세스 시간을 살펴볼 것이다. -a(또는 --time=atime, --time=access 또는 --time=use) 옵션은 액세스 시간 업데이트가 필요함을 지정한다. 목록 18은 cat 명령을 사용하여 f1 파일에 액세스하고 파일의 컨텐츠를 표시한다. 그 다음 ls -lls -lu를 사용하여 f1과 참조 파일로 f1을 사용하여 작성한 f1a에 대한 수정 및 액세스 시간을 각각 표시한다. 그리고 나서 f1의 액세스 시간을 f1a의 액세스 시간으로 touch -a를 사용하여 다시 설정한 다음 재설정이 완료 되었는지 확인한다.


목록 18. 액세스 시간 및 수정 시간
                    
[ian@echidna lpi103-2]$ ls -lu f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:39 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
[ian@echidna lpi103-2]$ ls -l f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a
[ian@echidna lpi103-2]$ touch -a -r f1a f1
[ian@echidna lpi103-2]$ ls -lu f1*
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 f1a

허용되는 여러 가지 시간 및 날짜 스펙에 대한 자세한 정보는 touchdate 명령에 대한 매뉴얼 또는 정보 페이지를 참조하자.


파일 찾기

이제까지 우리가 모든 것을 두드리는 커다란 반복적 해머와 보다 선택적으로 두드리는 글로빙 해머로 파일과 디렉토리라는 주제를 다루어왔다면, 이번에는 외과의사의 수술용 메스쪽에 좀 더 가깝다고 할 수 있는 find 명령에 대해 살펴보려고 한다. find 명령은 하나 이상의 디렉토리 트리에서 이름, 시간소인 또는 크기와 같은 기준에 따라 파일을 찾는 데 사용된다. 이번에도 우리는 lpi103-2 디렉토리를 사용한다.

찾기

find 명령은 이름의 전부 또는 일부를 사용하거나 크기, 유형, 파일 소유자, 작성 날짜 또는 마지막 액세스 날짜와 같은 다른 검색 기준에 따라 파일 또는 디렉토리를 검색한다. 가장 기본적인 찾기는 이름 또는 이름의 일부를 사용하는 검색이다. 목록 19는 lpi103-2 디렉토리에서 이름에 '1' 또는 'k'가 포함된 모든 파일을 우선 검색한 다음, 아래 참고에서 설명하는 일부 경로 검색을 수행하는 예를 보여준다.


목록 19. 이름을 기준으로 파일 찾기
                    
[ian@echidna lpi103-2]$ find . -name "*[1k]*"
./f1a
./f1
./text10
./backup
./backup/text1.bkp.1
./backup/text1.bkp.2
./text1
[ian@echidna lpi103-2]$ find . -ipath "*ACK*1"
./backup/text1.bkp.1
[ian@echidna lpi103-2]$ find . -ipath "*ACK*/*1"
[

참고:

  1. 사용할 수 있는 패턴은 우리가 앞서 와일드카드 및 글로빙(globbing)에서 본 것과 같은 쉘 와일드카드 패턴이다.
  2. -name 대신 -path를 사용하여 단순히 기본 파일 이름이 아닌 전체 경로를 일치시킬 수 있다. 이 경우, 해당 패턴은 경로의 한 부분에 대해서만 일치하는 일반적인 와일드카드 일치와는 달리 아마도 경로 컴포넌트 전체를 그 범위로 할 수 있다.
  3. 위의 ipath 사용 시와 같이 대소문자를 구분하지 않으려면 문자열 또는 패턴에서 검색하는 find 옵션 앞에 'i'를 사용한다.
  4. .bashrc 또는 현재 디렉토리(.)와 같이 이름이 점으로 시작하는 파일 또는 디렉토리를 찾으려면, 패턴의 일부로 반드시 앞에 점(.)을 지정해야 한다. 그렇지 않으면 이름 검색 시 이러한 파일 또는 디렉토리는 무시된다.

위의 첫 번째 예에서 우리는 파일과 디렉토리(./backup)를 모두 찾았다. -type 매개변수를 한 글자 유형과 함께 사용하여 검색을 제한한다. 정규 파일에 'f', 디렉토리에 'd', 기호 링크에 'l'을 사용한다. 가능한 다른 유형에 대해서는 find 명령의 매뉴얼 페이지를 확인하자. 목록 20에는 디렉토리(-type d) 단독 검색 및 파일 이름과 함께 검색(이 경우, * 또는 모두)을 수행한 결과가 나와 있다.


목록 20. 유형을 기준으로 파일 찾기
                    
[ian@echidna lpi103-2]$ find . -type d
.
./backup
[ian@echidna lpi103-2]$ find . -type d -name "*"
.
./backup

이름 양식 스펙이 없는 -type d 스펙은 와일드카드 "*"와 같이 이름 맨 앞에 점(.)이 있는 디렉토리(이 경우에는 현재 디렉토리 하나임)를 표시한다.

파일 크기를 기준으로 스펙 크기(n) 또는 제공 값보다 크거나(+n) 작은(-n) 파일을 검색할 수도 있다. 상한 및 하한 크기 제한을 사용하면 크기가 기준 범위 내에 있는 파일을 찾을 수 있다. 기본값으로, find-size 옵션은 512바이트 블록에 대해 단위 'b'를 가정한다. 여러 선택사항 중 바이트에 대해 'c' 또는 킬로바이트에 대해서는 'k'를 지정한다. 목록 21에서는 먼저 크기가 0인 모든 파일을 찾아본 다음 크기가 24 또는 25바이트인 파일을 모두 찾아본다. -size 0 대신 -empty를 지정해도 비어 있는 파일을 찾을 수 있다.


목록 21. 크기를 기준으로 파일 찾기
                    
[ian@echidna lpi103-2]$ find . -size 0
./f1a
./f6
./f8
./f2
./f3
./f7
./f4
./f9
./f5
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -print
./text2
./text5
./backup/text1.bkp.1
./backup/text1.bkp.2
./text1

목록 21의 두 번째 예제는 -print 옵션을 소개하며, 이는 검색에서 리턴된 결과를 출력하는 조치의 예제이다. Bash 쉘에서 아무런 조치가 지정되지 않을 경우의 기본 조치이다. 일부 시스템 그리고 일부 쉘의 경우에는 조치가 필요하며, 조치를 취하지 않을 경우 아무런 출력이 생성되지 않는다.

다른 조치로는 ls -lids 명령에서 해당 파일 정보를 인쇄하는 -ls 및 각 파일에 대해 명령을 실행하는 -exec 명령이 포함된다. -exec는 세미콜론을 사용하여 끝내야 하며 쉘에서 먼저 해석하기 전에 이스케이프되어야 한다. 또한 리턴된 파일을 명령에 사용하려면 {}를 지정한다. 중괄호도 쉘에 의미가 있으므로 따옴표로 묶거나 이스케이프해야 한다. 목록 22는 -ls-exec 옵션을 사용하여 파일 정보를 나열하는 방법을 보여준다. 두 번째 양식에는 idnode 정보가 나열되지 않는다는 점에 주목하자.


목록 22. 파일 찾기 및 조치 수행

                    
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -ls
933893    4 -rw-rw-r--   1 ian      ian            25 Aug 11 14:27 ./text2
933900    4 -rw-rw-r--   1 ian      ian            24 Aug 11 18:47 ./text5
934193    4 -rw-rw-r--   1 ian      ian            24 Aug 12 15:36 ./backup/text1.bkp.1
934195    4 -rw-rw-r--   1 ian      ian            24 Aug 12 15:36 ./backup/text1.bkp.2
933892    4 -rw-rw-r--   1 ian      ian            24 Aug 11 14:02 ./text1
[ian@echidna lpi103-2]$ find . -size -26c -size +23c -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 25 2009-08-11 14:27 ./text2
-rw-rw-r--. 1 ian ian 24 2009-08-11 18:47 ./text5
-rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.1
-rw-rw-r--. 1 ian ian 24 2009-08-12 15:36 ./backup/text1.bkp.2
-rw-rw-r--. 1 ian ian 24 2009-08-11 14:02 ./text1

-exec 옵션은 목적에 따라 다양한 방법으로 활용이 가능하다. 예:

find . -empty -exec rm '{}' \;

디렉토리에 있는 빈 파일을 모두 제거한다.

find . -name "*.htm" -exec mv '{}' '{}l' \;

.htm 파일을 모두 .html 파일로 이름을 바꾼다.

find의 마지막 예제로, touch 명령에서 설명한 시간소인을 사용하여 특정 시간소인을 보유한 파일을 찾아본다. 목록 23에 세 가지 예제가 나와 있다.

  1. -mtime -2와 함께 사용될 경우 find 명령은 최근 2일 이내에 수정된 모든 파일을 찾는다. 이 때 하루는 현재 날짜 및 시간으로부터 24시간에 해당된다. 수정 시간이 아닌 액세스 시간을 기준으로 파일을 찾으려면 -atime을 사용한다는 점을 참고한다.
  2. -daystart 옵션을 추가하면 자정에서 시작하는 달력의 날짜로 하루를 계산하겠다는 의미이다. 이제 f3 파일은 목록에서 제외된다.
  3. 마지막으로는 날짜가 아닌 분 단위의 시간 범위를 사용하여 1시간(60분) 및 10시간(600분) 사이에 수정된 파일을 찾는 방법을 보여준다.

목록 23. 시간소인을 기준으로 파일 찾기
                    
[ian@echidna lpi103-2]$ date
Sat Aug 15 00:27:36 EDT 2009
[ian@echidna lpi103-2]$ find . -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-13 06:00 ./f6
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9
[ian@echidna lpi103-2]$ find . -daystart -mtime -2 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-15 02:00 ./f8
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10
-rw-rw-r--. 1 ian ian 0 2009-08-14 11:00 ./f4
-rw-rw-r--. 1 ian ian 0 2009-11-05 00:00 ./f9
[ian@echidna lpi103-2]$ find . -mmin -600 -mmin +60 -type f -exec ls -l '{}' \;
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:25 ./f1a
-rw-rw-r--. 1 ian ian 4 2009-08-14 18:25 ./f1
-rw-rw-r--. 1 ian ian 0 2009-08-14 18:27 ./f2
-rw-rw-r--. 1 ian ian 58 2009-08-14 17:30 ./text10

find 명령의 매뉴얼 페이지를 통해 이 간략한 기사에서 다루지 못한 다양한 옵션을 배워볼 수 있다.


파일 식별

파일 이름에는 종종 파일에 포함된 내용에 대한 힌트를 제공하는 gif, jpeg 또는 html 등의 접미부가 있다. Linux는 이러한 접미부를 필요로 하지 않으며 보통 파일 유형을 식별하는 데 접미부를 사용하지 않는다. 처리 중인 파일의 유형을 알고 있다면 파일을 표시하거나 조작하는 데 사용할 프로그램을 선택하는 데 도움이 된다. file 명령을 사용하면 하나 이상의 파일에 들어 있는 데이터의 유형을 알 수 있다. 목록 24는 file 명령 사용의 몇 가지 예를 보여준다.


목록 24. 파일 컨텐츠 식별
                    
[ian@echidna lpi103-2]$ file backup text1 f2 ../p-ishields.jpg /bin/echo
backup:            directory
text1:             ASCII text
f2:                empty
../p-ishields.jpg: JPEG image data, JFIF standard 1.02
/bin/echo:         ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically 
linked (uses shared libs), for GNU/Linux 2.6.18, stripped

file 명령은 세 가지 유형의 테스트를 통해 각 파일을 분류한다. 파일 시스템 테스트는 stat 명령의 결과로 예를 들어 파일이 비어 있는지 또는 디렉토리인지 등을 판별한다. 매직 테스트라고도 불리우는 이 테스트는 파일을 식별하는 특정 컨텐츠가 있는지 확인한다. 이러한 시그니처는 매직 넘버로도 알려져 있다. 마지막으로, 언어 테스트는 텍스트 파일의 컨텐츠를 확인하여 파일이 XML 파일, C 또는 C++ 언어 소스인지, 트로프(troff) 파일인지 또는 다른 종류의 언어 프로세서를 위한 소스로 알려진 다른 파일인지 판별한다. -k 또는 --keep-going 옵션을 지정하지 않으면, 검색되는 첫 번째 유형이 보고된다.

file 명령에서 사용 가능한 옵션의 종류는 매우 많으며 이에 대해서는 매뉴얼 패이지에서 학습할 수 있다. 목록 25에서는 -i(또는 --mime) 옵션을 사용하여 파일 유형을 사람이 읽을 수 있는 일반적인 출력이 아닌 MIME 문자열로 표시하는 방법을 보여준다.


목록 25. 파일 컨텐츠를 MIME으로 식별
                    
[ian@echidna lpi103-2]$ file -i backup text1 f2 ../p-ishields.jpg /bin/echo
backup:            application/x-directory; charset=binary
text1:             text/plain; charset=us-ascii
f2:                application/x-empty; charset=binary
../p-ishields.jpg: image/jpeg; charset=binary
/bin/echo:         application/x-executable; charset=binary

매직 넘버 파일은 file 명령으로도 관리할 수 있다. 자세한 정보는 매뉴얼 페이지를 참조하자.

참고: identify 명령은 ImageMagick 패키지의 일부이며 이미지 파일 유형 식별 시 보다 자세한 내용을 제공하는 추가 도구이다.


파일 압축

파일을 백업하거나 아카이브하거나 전송할 때는 파일을 압축하는 것이 일반적이다. Linux 환경에서 널리 알려진 압축 프로그램 두 가지는 gzipbzip2이다. gzip 명령은 Lempel-Ziv 알고리즘을 사용하는 반면 bzip2은 Burrows-Wheeler 블록 정렬 알고리즘을 사용한다.

gzip 및 gunzip 사용

텍스트 파일에서는 일반적으로 압축이 잘 작동한다. 많은 이미지 형식은 이미 데이터가 압축되어 있기 때문에 이미지 또는 다른 2진 파일들에서는 압축이 잘 작동하지 않을 수 있다. 적절한 크기의 텍스트 파일 압축을 시연하기 위해 /etc/services를 그 동안 사용해온 디렉토리로 복사하여 목록 26에 나와 있는 대로 gzip을 통해 압축한다. cp-p 옵션을 사용하여 /etc/services의 시간소인을 보존한다. 압축된 파일은 시간소인이 동일하고 접미부가 .gz이다.


목록 26. gzip으로 압축
                    
[ian@echidna lpi103-2]$ cp -p /etc/services .
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna lpi103-2]$ gzip services
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 124460 2009-04-10 04:42 services.gz

파일의 압축을 풀 때는 -d 옵션을 gzip과 함께 사용하거나 좀 더 일반적으로는 gunzip 명령을 사용한다. 목록 27은 gzip 명령에 -d 옵션을 사용한 경우를 보여준다. 압축을 푼 파일은 파일 이름과 시간소인이 원래 파일로 돌아간다.


목록 27. gzip으로 압축 풀기
                    
[ian@echidna lpi103-2]$ gzip -d services.gz
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services

bzip2 및 bunzip2 사용

bzip2 명령은 목록 28에서 보는 바와 같이 gzip과 비슷한 방법으로 작동한다.


목록 28. bzip2로 압축
                    
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna lpi103-2]$ bzip2 services
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 113444 2009-04-10 04:42 services.bz2
[ian@echidna lpi103-2]$ bunzip2 services.bz2
[ian@echidna lpi103-2]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services

gzip과 bzip2의 차이

많은 bzip2 옵션이 gzip의 옵션과 동일하도록 설계되었지만 두 명령의 옵션이 정확히 일치하는 것은 아니다. 두 가지 예제를 통해 알고 있을지도 모르지만 압축이 풀린 파일은 원본 파일과 이름과 시간소인이 동일하다. 그러나 압축한 파일의 이름을 바꾸거나 터치(touch)하면 동일하게 작동하지 않을 수 있다. gzip 명령은 -N 또는 --name 옵션으로 이름과 시간소인을 강제로 유지할 수 있지만 bzip2 명령은 그렇지 않다. gzip 명령은 -l 옵션으로 압축 파일에 대한 정보를 표시할 수도 있으며 압축을 풀 때 사용할 이름이 포함된다. 목록 29는 두 명령의 몇 가지 차이점을 보여준다.


목록 29. gzip과 bzip2의 몇 가지 차이
                    
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna ~]$ gzip -N services
[ian@echidna ~]$ touch services.gz
[ian@echidna ~]$ mv services.gz services-x.gz
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 124460 2009-09-23 14:08 services-x.gz
[ian@echidna ~]$ gzip -l services-x.gz
         compressed        uncompressed  ratio uncompressed_name
             124460              630983  80.3% services-x
[ian@echidna ~]$ gzip -lN services-x.gz
         compressed        uncompressed  ratio uncompressed_name
             124460              630983  80.3% services
[ian@echidna ~]$ gunzip -N services-x.gz
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 630983 2009-04-10 04:42 services
[ian@echidna ~]$
[ian@echidna ~]$ bzip2 services
[ian@echidna ~]$ mv services.bz2 services-x.bz2
[ian@echidna ~]$ touch services-x.bz2
[ian@echidna ~]$ ls -l serv*
-rw-r--r--. 1 ian ian 113444 2009-09-23 14:10 services-x.bz2
[ian@echidna ~]$ bunzip2 services-x.bz2
[ian@echidna ~]$ ls -l serv*
-rw-rw-r--. 1 ian ian 630983 2009-09-23 14:10 services-x
[ian@echidna ~]$ rm services-x # Don't need this any more

gzipbzip2은 모두 stdin의 입력을 허용한다. 두 명령은 모두 stdout으로 직접 출력하는 -c 옵션을 지원한다.

bzip2와 연관된 두 가지 다른 명령이 있다.

  1. bzcat 명령은 stdout으로 파일의 압축을 풀고 이는 bzip2 -dc에 해당한다.
  2. bzip2recover 명령은 손상된 bzip2 파일에서 데이터를 복구한다.

gzipbzip2의 다른 옵션에 대해 자세히 학습하려면 매뉴얼 페이지가 도움이 될 것이다.

기타 압축 도구

compressuncompress는 오래 전부터 사용되는 프로그램이지만 여전히 Linux와 UNIX 시스템에서 자주 사용된다.

이 외에도 Info-ZIP 프로젝트의 zipunzip 명령이 Linux에 대해 구현된다. 이러한 명령은 다양한 하드웨어와 운영 체체에서 사용이 가능한 크로스 플랫폼 압축 기능을 제공한다. 모든 운영 체제에서 같은 파일 속성 또는 파일 시스템 기능을 지원하는 것은 아니다. Windows 시스템에서 zip으로 압축된 제품 파일을 다운로드하여 압축을 해제한 다음 결과 파일을 CD 또는 DVD로 전송하여 Linux에서 설치하려 한다면 Windows 시스템에서는 원본 압축 해제 파일 세트의 일부인 기호 링크를 지원하지 않기 때문에 설치에 문제가 발생할 것이다.

해당 또는 기타 압축 프로그램에 대한 자세한 정보는 각각에 대한 매뉴얼 페이지를 참고하자.


파일 아카이브

tar, cpiodd 명령은 아카이브 또는 다른 사용자/사이트로의 전송을 위해 파일 그룹 또는 전체 파티션 까지도 백업하는 데에 일반적으로 사용된다. LPIC-2 인증의 일부인 Exam 201은 백업 고려사항에 대해 큰 비중을 두고 세부적으로 다룬다.

백업에 접근하는 일반적인 방법은 세 가지가 있다.

  1. 차등 또는 누적 백업은 마지막으로 전체 백업을 수행한 이후에 변경된 모든 항목을 백업한다. 복구를 수행하려면 마지막 전체 백업과 최신 차등 백업이 필요하다.
  2. 증분 백업은 마지막 증분 백업 이후에 변경된 항목만 백업한다. 복구를 수행하려면 마지막 전체 백업과 마지막 전체 백업 이후의 모든 증분 백업(순서대로)이 필요하다.
  3. 전체 백업은 보통 전체 파일 시스템, 디렉토리 또는 관련 파일 그룹을 백업하는 완전한 백업이다. 이 방법이 백업 작성에 가장 오랜 시간이 소요되므로 다른 두 가지 접근 방법과 함께 사용하는 것이 보편적이다.

이러한 명령은 이 기사에서 이제까지 배운 다른 명령들과 함께 모든 백업 태스크를 수행하는 데 필요한 도구를 제공한다.

tar 사용

tar(Tape ARchive에서 유래)는 입력 파일 세트에서 아카이브 파일 또는 tarfile/tarball을 작성하며 이러한 아카이브에서 파일을 복원하기도 한다. 디렉토리가 tar에 대한 입력으로 제공되면 모든 파일 및 서브디렉토리가 자동으로 포함되므로 디렉토리 구조의 서브트리 아카이브에 tar를 사용하면 매우 편리하다.

출력은 파일, 디바이스(예: 테이프, 디스켓) 또는 stdout일 수 있다. 출력 위치는 -f 옵션으로 지정된다. 다른 명령 옵션으로는 아카이브를 작성하는 -c, 아카이브를 추출하는 -x, 상세한 출력을 위한 -v(처리 중인 파일 나열), gzip 압축을 사용하는 -z 및 bzip2 압축을 사용하는 -j 등이 있다. 대부분의 tar 옵션에는 하나의 하이픈을 사용하는 짧은 양식과 한 쌍의 하이픈을 사용하는 긴 양식이 있다. 여기에서는 짧은 양식을 보여준다. 긴 양식과 추가 옵션은 매뉴얼 페이지를 참조하자.

목록 30에는 tar를 사용하여 lpi103-2 디렉토리의 백업을 작성하는 방법이 나와 있다.


목록 30. tar를 사용하여 lpi103-2 디렉토리 백업
                    
[ian@echidna lpi103-2]$ tar -cvf ../lpitar1.tar .
./
./text3
./yab
...
./f5

일반적인 사용자라면 공간을 저장하거나 전송 시간을 절약하기 위해 아카이브 파일을 압축하려고 한다. tar 명령의 GNU 버전을 사용하면 하나의 옵션으로 이를 수행할 수 있다. — gzip에서는 -z이고 bzip2에서는 -b이다. 목록 31은 -z 옵션의 사용과 두 아카이브의 크기 차이를 보여준다.


목록 31. gzip으로 tar 아카이브 압축
                    
[ian@echidna lpi103-2]$ tar -zcvf ../lpitar2.tar ~/lpi103-2/
tar: Removing leading `/' from member names
/home/ian/lpi103-2/
/home/ian/lpi103-2/text3
/home/ian/lpi103-2/yab
...
/home/ian/lpi103-2/f5
[ian@echidna lpi103-2]$ ls -l ../lpitar*
-rw-rw-r--. 1 ian ian 30720 2009-09-24 15:38 ../lpitar1.tar
-rw-rw-r--. 1 ian ian   881 2009-09-24 15:39 ../lpitar2.tar

목록 31은 tar의 또다른 중요 기능도 나타낸다. 우리는 절대 디렉토리 경로를 사용했으며 출력의 첫 번째 행에서는 tar가 멤버 이름에서 맨 앞의 슬래시(/)를 제거한다는 것을 알 수 있다. 이로써 확인 목적으로 다른 위치에서 파일을 복원할 수 있는데, 시스템 파일을 복원하려는 경우에 이는 매우 중요하다. 꼭 절대 이름을 저장하고자 한다면 -p 옵션을 사용하자. 아카이브에서 복원할 때는 모두 상대 이름이기 때문에 절대 경로 이름과 상대 경로 이름이 섞이는 것을 방지하려는 경우에도 이 옵션은 유용하다.

tar 명령에 -r 또는 --append 옵션을 사용하면 아카이브에 정보를 추가할 수 있다. 이로 인해 아카이브에 파일의 사본이 여러 개 생길 수 있다. 그런 경우에는 마지막으로 생성된 사본이 복원 조작 중에 복원된다. 여러 개의 파일 중 특정 파일을 선택하려는 경우에는 --occurrence 옵션을 사용할 수 있다. 아카이브가 테이프가 아닌 일반 파일 시스템에 있을 경우 -u 또는 --update 옵션을 사용하여 아카이브를 업데이트할 수 있다. 이 조작은 아카이브에 있는 파일의 시간소인이 파일 시스템의 시간소인과 비교되는 것을 제외하면 아카이브에 추가하는 것처럼 작동하며, 아카이브된 버전이 추가된 이후에 수정된 파일에만 해당된다. 이미 언급한 바와 같이 테이프 아카이브에서는 작동하지 않는다.

tar 명령은 또한 아카이브를 현재 파일 시스템과 비교하여 아카이브에서 파일을 복원한다. 비교를 수행하려면 -d, --compare 또는 --diff 옵션을 사용한다. 출력에는 컨텐츠가 다른 파일 뿐만 아니라 시간소인이 다른 파일도 표시될 것이다. 보통, 다른 점이 있는 파일들만 나열된다(있는 경우). -v 옵션을 사용하면 앞에서 논의한 대로 상세한 출력이 표시된다. -C 또는 --directory 옵션을 사용하면 tar 명령이 현재 디렉토리 대신 지정한 디렉토리에서 조작을 시작한다.

목록 32에 몇 가지 예제가 나와 있다. 우리는 touch를 사용하여 f1 파일의 시간소인을 수정한 다음, 아카이브 중 하나에서 f1을 복원하기 전에 tar의 비교 조작을 시연할 것이다. 시연을 위해 다양한 옵션 양식이 사용된다.


목록 32. tar를 사용하여 비교 및 복원
                    
[ian@echidna lpi103-2]$ touch f1
[ian@echidna lpi103-2]$ tar --diff --file ../lpitar1.tar .
./f1: Mod time differs
[ian@echidna lpi103-2]$ tar -df ../lpitar2.tar -C /
home/ian/lpi103-2/f1: Mod time differs
[ian@echidna lpi103-2]$ tar -xvf ../lpitar1.tar ./f1 # See below
./f1
[ian@echidna lpi103-2]$ tar --compare -f ../lpitar2.tar --directory /

복원을 위해 지정한 파일 또는 디렉토리가 반드시 아카이브의 이름과 일치해야 한다. ./f1이 아닌 f1을 복원하는 것은 이번 경우에는 작동하지 않는다. 글로빙을 사용할 수 있지만 원하는 것보다 더 많거나 적게 복원될 수 있으므로 주의가 필요하다. --list 또는 -t 옵션을 사용하면 아카이브에 무엇이 있는지 확실하지 않을 때 아카이브 컨텐츠를 나열할 수 있다. 목록 33은 ./f1 보다 많은 파일이 복원되는 와일드카드 스펙의 예제를 보여준다.


목록 33. tar로 아카이브 컨텐츠 나열
                    
[ian@echidna lpi103-2]$ tar -tf ../lpitar1.tar "*f1*"
./f1a
./f1

find 명령으로 아카이브할 파일을 선택하고 결과를 tar로 파이핑할 수 있다. 우리는 이 기법을 cpio에 대한 논의의 일부로 다루겠지만, 동일한 방법이 tar에도 적용된다.

여기에서 학습한 다른 명령과 마찬가지로 이 간략한 소개에서 다루지 않은 옵션이 존재한다. 자세한 내용은 매뉴얼 또는 정보 페이지를 참조한다.

cpio 사용

cpio 명령은 copy-out 모드에서 아카이브를 작성하고 copy-in 모드에서 아카이브를 복원하며 copy-pass 모드에서는 한 위치에서 다른 위치로 파일 세트를 복사한다. copy-out 모드에 대해서는 -o 또는 --create 옵션, copy-in 모드에 대해서는 -i 또는 --extract 옵션, copy-pass 모드에 대해서는 -p 또는 --pass-through 옵션을 사용한다. 입력은 stdin에서 제공하는 파일 목록이다. 출력은 stdout 또는 -f--file 옵션과 함께 지정되는 디바이스 또는 파일이다.

목록 34는 find 명령을 사용하여 파일 목록을 생성한 다음 파이프를 통해 해당 목록을 cpio로 전달한다. -print0 옵션을 find 명령에서 사용하면 파일 이름에 대해 널로 끝나는 문자열이 생성되고 이에 상응하는 --null 옵션을 cpio에서 사용하면 이 형식을 읽는다는 점을 참고한다. 이로써 공백 또는 줄 바꿈 문자가 임베드된 파일 이름을 올바로 처리할 수 있다. -depth 옵션을 사용하면 find 명령이 디렉토리 이름 앞에 디렉토리 항목을 나열한다. 이 예에서 우리는 lpi103-2mple 디렉토리 아카이브를 두 개만 작성했으며 하나는 상대 이름이고 하나는 절대 이름을 사용했다. 이번 주에 수정된 파일만 찾기 등과 같이 선택한 파일을 제한하는 데 find의 여러 가지 기능을 사용하지 않는다.


목록 34. cpio를 사용하여 디렉토리 백업
                    
[ian@echidna lpi103-2]$ find . -depth -print0 | cpio --null -o > ../lpicpio.1
3 blocks
[ian@echidna lpi103-2]$ find ~/lpi103-2/ -depth -print0 | cpio --null -o > ../lpicpio.2
4 blocks

파일 아카이브 시 파일 목록을 확인하고 싶다면 cpio-v 옵션을 추가한다.

copy-in 모드(옵션 -i 또는 --extract)에서 cpio 명령은 아카이브의 컨텐츠를 나열하거나 선택한 파일을 복원한다. 파일을 나열할 때 --absolute-filenames 옵션을 지정하면 관련이 없는 메시지의 수가 줄어든다. 이전 버전의 cpio에서는 / 문자로 시작하는 각 경로에서 / 문자를 스트라이핑할 때 관계 없는 메시지가 발행된다. 최신 구현에서는 이 옵션이 종종 무시된다. 우리의 기존 아카이브를 선택적으로 나열한 결과물이 목록 35에 나와 있다.


목록 35. cpio를 사용하여 선택한 파일 나열 및 복원
                    
[ian@echidna lpi103-2]$ cpio  -i --list  "*backup*" < ../lpicpio.1
backup
backup/text1.bkp.1
backup/text1.bkp.2
3 blocks
[ian@echidna lpi103-2]$ cpio  -i --list absolute-filenames "*text1*" < ../lpicpio.2
/home/ian/lpi103-2/text10
/home/ian/lpi103-2/backup/text1.bkp.1
/home/ian/lpi103-2/backup/text1.bkp.2
/home/ian/lpi103-2/text1
4 blocks

목록 36은 경로에서 모든 "text1"을 사용하는 파일을 임시 서브디렉토리에 복원하는 방법을 보여준다. 이러한 파일 중 일부는 서브디렉토리에 있다. tar와는 달리, 디렉토리 트리가 없을 경우에는 -d 또는 --make-directories 옵션을 명시적으로 지정해야 한다. 또한 cpio는 아카이브 사본이 포함된 파일 시스템에서 새로운 파일을 대체하지 않으며, 대체를 원할 경우에는 -u 또는 --unconditional 옵션을 지정해야 한다.


목록 36. cpio를 사용하여 선택한 파일 복원
                    
[ian@echidna lpi103-2]$ mkdir temp
[ian@echidna lpi103-2]$ cd temp
[ian@echidna temp]$ cpio  -idv "*f1*" "*.bkp.1" < ../../lpicpio.1
f1a
f1
backup/text1.bkp.1
3 blocks
[ian@echidna temp]$ cpio  -idv "*.bkp.1" < ../../lpicpio.1
cpio: backup/text1.bkp.1 not created: newer or same age version exists
backup/text1.bkp.1
3 blocks
[ian@echidna temp]$ cpio  -id --no-absolute-filenames "*text1*" < ../../lpicpio.2
cpio: Removing leading `/' from member names
4 blocks
./home/ian/lpi103-2/backup/text1.bkp.1
./home/ian/lpi103-2/backup/text1.bkp.2
./home/ian/lpi103-2/text1
./backup/text1.bkp.1
[ian@echidna temp]$ cd ..
[ian@echidna lpi103-2]$ rm -rf temp # You may remove these after you have finished

기타 옵션에 대한 세부사항은 매뉴얼 페이지를 참조하자.

dd 명령

dd 명령은 가장 단순한 형태로 입력 파일을 출력 파일로 복사한다. cp 명령을 이미 알고 있는데 파일 복사를 위한 다른 명령이 왜 필요한지 의문을 가질 수도 있다. dd 명령은 일반적인 cp 명령이 할 수 없는 일들을 할 수 있다. 특히,소문자에서 대문자로 또는 ASCII에서 EBCDIC으로의 변환과 같은 파일 변환을 수행할 수 있다. 또한 파일 블록을 재구성할 수 있어 테이프로 파일을 전송할 때 유용할 수 있다. 선택한 파일 블록만 건너뛰거나 포함할 수 있다. 마지막으로 /dev/sda와 같은 원시 디바이스에 읽거나 쓸 수 있어 전체 파티션 이미지 파일을 작성하거나 복원할 수 있게 해준다. 디바이스에 쓰려면 보통 루트 권한이 필요하다.

목록 37에 나와 있는 바와 같이 conv 옵션을 사용하여 대문자로 파일을 변환하는 간단한 예제부터 시작해 보자. 기본값인 stdin 대신 if 옵션을 사용하여 입력 파일을 지정한다. 마찬가지로, of 옵션을 사용하여 stdout으로의 기본 출력을 대체할 수 있다. 시연을 위해 ibsobs 옵션으로 입력과 출력 블록 크기를 다르게 지정했다. 대형 파일의 경우에는 디스크에서 디스크로 파일을 전송할 때 블록 크기를 더욱 크게 하여 신속히 조작을 수행하는 것이 편리할 수 있다. 그 외의 경우, 블록 크기는 대부분 자기 테이프에서 사용된다. 목록 끝에 있는 세 개의 상태 표시줄은 읽고 쓴 전체 및 부분 블록의 수와 전송된 데이터 양의 총계를 보여준다.


목록 37. do를 사용하여 대문자로 텍스트 변환
                    
[ian@echidna lpi103-2]$ cat text6
1 apple
2 pear
3 banana
9       plum
3       banana
10      apple
1 apple
2 pear
3 banana
9       plum
3       banana
10      apple
[ian@echidna lpi103-2]$ dd if=text6 conv=ucase ibs=20 obs=30
1 APPLE
2 PEAR
3 BANANA
9       PLUM
3       BANANA
10      APPLE
1 APPLE
2 PEAR
3 BANANA
9       PLUM
3       BANANA
10      APPLE
4+1 records in
3+1 records out
98 bytes (98 B) copied, 0.00210768 s, 46.5 kB/s

파일 중 하나가 원시 디바이스일 수 있다. 자기 테이프에서는 흔한 경우이지만 /dev/hda1 또는 /dev/sda2와 같은 전체 디스크 파티션은 파일 또는 테이프에 백업할 수 있다. 디바이스의 파일 시스템을 마운트 해제하거나 읽기 전용으로 마운트하여 백업 중에 데이터가 변경되지 않도록 하는 것이 가장 좋다. 목록 39는 입력 파일이 원시 디바이스 dev/sda3이고 출력 파일이 파일 사용자 홈 디렉토리의 backup-1인 경우를 보여준다. 테이프 또는 플로피 디스크에 파일을 덤프하려면 of=/dev/fd0 또는 of=/dev/st0과 비슷하게 지정할 것이다.


목록 38. dd를 사용하여 파티션 백업
                    
[root@echidna ~]# dd if=/dev/sda2 of=backup-1
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 24.471 s, 32.6 MB/s

797,852,160바이트의 데이터가 복사되었고 이 파티션 중 약 3%만이 실제로 사용된다 하더라도 출력 파일의 크기가 매우 크다는 점에 주목하자. 하드웨어 압축 없이 테이프에 복사 중이라면 데이터 압축이 필요할 수 있다. 목록 39는 이를 수행하는 한 가지 방법과 /dev/sda3의 파일 시스템 사용률 및 파일 크기를 표시하는 lsdf 명령 출력을 보여준다.


목록 39. dd를 사용하여 압축 후 백업
                    
[root@echidna ~]# dd if=/dev/sda2 |gzip >backup-2
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 23.4617 s, 34.0 MB/s
[root@echidna ~]# ls -l backup-[12]
-rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1
-rw-r--r--. 1 root root    995223 2009-09-25 17:14 backup-2
[root@echidna ~]# df -h /dev/sda2
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             755M   18M  700M   3% /grubfile

gzip 압축은 압축하지 않은 크기의 약 20%까지 파일 크기를 줄인다. 그러나 사용되지 않은 블록에 임의 데이터가 포함될 수 있으므로 압축된 백업도 파티션의 총 데이터보다 훨씬 크기가 클 수 있다.

복사된 총 바이트를 처리된 레코드의 수로 나눌 경우, dd에서 512바이트 데이터 블록을 쓰고 있다는 것을 알 수 있다. 테이프와 같은 원시 출력 디바이스로 복사하는 경우에는 매우 비효율적인 조작을 초래할 수 있다. 위에서 언급한 대로 obs 옵션을 지정하여 출력 크기를 변경하거나 ibs 옵션으로 입력 블록 크기를 지정한다. bs만을 지정하여 입력과 출력 블록 크기를 모두 공통 값으로 설정할 수도 있다. 테이프 사용 시에는 테이프 읽기를 위한 블록 크기가 쓰기에 사용하는 블록 크기가 동일해야 한다.

백업 저장에 테이프가 여러 개 필요하거나 다른 제거 가능한 스토리지가 필요한 경우에는 split과 같은 유틸리티를 사용하여 작은 조각으로 나누어야 한다. 디스크 또는 테이프 레이블 등의 블록을 건너뛰려면 dd를 통해 이를 수행할 수 있다. 매뉴얼 페이지에서 예제를 참조하자.

dd 명령은 파일 시스템을 인식하지 않으므로 파일 시스템에 무엇이 담겨 있는지 알아내려면 파티션 덤프를 복원해야 한다. 목록 40은 목록 39에서 이러한 목적으로 제거 가능한 USB 드라이브에 특별히 작성되었던 파티션 /dev/sdc7에 덤프된 파티션을 복원하는 방법을 보여준다.


목록 40. dd를 사용하여 파티션 복원
                    
[root@echidna ~]# gunzip backup-2 -c | dd  of=/dev/sdc7
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 30.624 s, 26.1 MB/s

몇몇 CD 및 DVD 굽기 애플리케이션에서 실제 디바이스 쓰기를 수행하기 위해 뒷편에서 dd 명령을 사용한다는 것을 안다면 흥미를 느낄 수도 있다. 내가 사용하는 유틸리티에서 실제 사용되는 명령의 로그를 제공한다면 dd에 대해 좀 더 알게된 지금 로그를 살펴보는 것이 유익할 수 있다. ISO 이미지를 CD 또는 DVD 디스크에 구울 때 오류가 없음을 확인하는 한 가지 방법은 dd를 사용하여 디스크를 다시 읽고 결과를 cmp 유틸리티를 통해 파이핑하는 것이다. 목록 41은 ISO 이미지가 아닌 이 기사에서 작성한 백업 파일을 사용하여 일반적인 기법을 보여준다. 이미지의 파일 크기를 사용하여 읽을 블록의 수를 계산한다는 점에 주의한다.


목록 41. 파일 시스템에서 이미지 비교
                    
[root@echidna ~]# ls -l backup-1
-rw-r--r--. 1 root root 797852160 2009-09-25 17:13 backup-1
[root@echidna ~]# echo $(( 797852160 / 512 )) # calculate number of 512 byte blocks
1558305
[root@echidna ~]# dd if=/dev/sdc7 bs=512 count=1558305 | cmp - backup-1
1558305+0 records in
1558305+0 records out
797852160 bytes (798 MB) copied, 26.7942 s, 29.8 MB/s


참고자료

교육

제품 및 기술

  • developerWorks에서 직접 다운로드할 수 있는 IBM 시험판 소프트웨어를 사용하여 Linux와 관련된 후속 개발 프로젝트를 구현해 볼 수 있다.

토론

  • 포럼에 참여하기.

  • 사용자의 개인 프로파일과 사용자 정의 홈 페이지가 제공되는 My developerWorks 커뮤니티에서는 관심을 가지고 있는 developerWorks의 여러 주제를 추적할 수 있으며 다른 developerWorks 사용자들과 의견을 나눌 수도 있다.

필자소개

Ian Shields 사진 developerWorks Contributing author level

Ian Shields는 developerWorks 리눅스 영역을 위한 리눅스 프로젝트 다수를 수행하고 있다. Shields는 노스 캐롤라이나 주 소재 IBM 리서치 트라이앵글 파크에서 선임 프로그래머로 일한다. Shields는 1973년 시스템 엔지니어로 오스트레일리아, 캔베라에 있는 IBM 사무실에 들어갔으며 캐나다 몬트리얼과 노스 캐롤라이나 주 RTP에서 통신 시스템과 배포 컴퓨팅 부문에서 일해왔다. Shields는 특허 여러 건을 획득했으며, 논문 여러 건을 발표했다. Shields는 순수 수학과 철학 학사 학위를 오스트레일리안 국립 대학에서 받았다. 노스 캐롤라이나 주립 대학에서 컴퓨터 과학 분야를 대상으로 석사와 박사 학위를 받았다. 전자편지 주소는 ishields@us.ibm.com이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=리눅스
ArticleID=783352
ArticleTitle=Linux 학습, 기초 과정: 파일 및 디렉토리 관리
publish-date=10112011

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.