bash script (backup)2021. 9. 24. 16:56

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/524868

 

find 명령에서 -maxdepth 옵션과 -mindepth 옵션을 사용하면 검색하는 디렉토리의 범위(깊이)를 조정할 수 있다. 깊이 0이면 시작하는 디렉토리 자체이다. 깊이 1이면 시작하는 디렉토리 내부의 파일/디렉토리를, 깊이 2이면 그 아래에 있는 하위 디렉토리 내부의 파일/디렉토리를 의미한다. 말로 설명하면 좀 복잡한데, 아래의 예시들을 보면 어느 정도 감이 잡힐 것이다.

# /tmp 디렉토리 및 하위의 파일/디렉토리 모두 출력

find /tmp

/tmp

/tmp/my_file.txt

/tmp/my_dir1/my_file1.txt

...

 

# /tmp 디렉토리만 출력

find /tmp -maxdepth 0

/tmp

 

# /tmp 디렉토리안에 있는 파일/디렉토리 출력, 하위 디렉토리는 제외(-maxdepth 1)

find /tmp -maxdepth 1

/tmp/my_file.txt

/tmp/my_dir1

...

 

# /tmp 디렉토리 안에 있는 파일(-type f)만 출력, 하위 디렉토리 제외

find /tmp -maxdepth 1 -type f

/tmp/my_file.txt

...

 

# 홈디렉토리를 제외하고 그 하위디렉토리부터(-mindepth 2) 검색

find ~/ -mindepth 2

/tmp/my_dir1/my_file1.txt

...

 

위의 예시에서 보듯이, 시작 디렉토리가 깊이 0, 그 아래의 파일/디렉토리가 깊이 1, 그 아래의 파일/디렉토리가 깊이 2 이런식으로 생각하면 된다.

 

디렉토리 구조가 복잡할 경우에 특정 범위의 항목에서만 파일이나 디렉토리를 검색할 수 있어서 매우 편리하다.

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2021. 5. 10. 15:36

 

반달가면 이글루에서 백업 - bahndal.egloos.com/514695

 

조금 생각해 보면 금방 알 수 있는 내용이긴 하지만, 최근 쇠퇴하고 있는 기억력을 절감하는 중이라 적어 두기로 했다.

grep 명령을 이용해서 특정 문자열을 검색하고 해당 문자열을 포함한 파일명을 찾는 자세한 방법은 이전에 올린 게시물을 참고하자.

 

일단 아래의 예시를 보자. -H 옵션을 사용하면 결과가 파일명:문자열 형태로 출력된다. -r(recursive) 옵션은 지정한 디렉토리와 그 하위 디렉토리에서 검색하기 위한 것이다.

# /home/john/Documents 디렉토리와 그 하위 디렉토리에서 abcd를 포함한 파일명과 해당 문자열을 출력
grep -Hr abcd /home/john/Documents

/home/john/Documents/my_file.txt:abcdefg

/home/john/Documents/my_file2.dat:abcde_xyz

 

다단계로 복잡한 검색을 하면서 파일명도 확인하려고 한다면, 일단 파일명을 확인하기 위한 -H 옵션으로 검색을 하고, 나머지 복잡한 검색을 파이프(|)를 이용해서 뒤쪽으로 이어주면 된다. 아래의 예시를 보자.

 

# abcd가 포함된 파일명과 해당 문자열을 검색한 후에 xyz가 포함된 항목을 제외(-v 옵션)

grep -Hr abcd /home/john/Documents | grep -v xyz

/home/john/Documents/my_file.txt:abcdefg

 

파이프 이후에는 -H 옵션이 의미가 없어진다. 입력이 파일이 아니라 이전 명령의 출력값이 되기 때문이다. 아래와 같이 사용하면 파일명을 확인할 수 없다.

 

# 이렇게 하면 파일명 확인 불가능

grep -r abcd /home/john/Documents | grep -H -v xyz

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2021. 1. 28. 13:36

 

반달가면 이글루에서 백업 - bahndal.egloos.com/498262

 

grep 명령을 이용하면 특정한 문자열을 포함하고 있는 파일들이 뭐가 있는지 찾을 수 있다. 훌륭하군!

일단 기본부터 차근차근 살펴보자. grep 명령의 기본 형식은 아래와 같다.

# [옵션]을 적용하여 [파일]의 내용을 검색, [문자열]을 찾음
grep [옵션] [문자열] [파일]

 

이제 아래의 예시를 보자. my_memo.txt 파일에서 abcd 문자열이 포함되어 있는지 검색하고 파일명과 함께 문자열이 포함된 행을 찾아 출력하는 것이다. -H 옵션을 주면 찾은 문자열뿐만 아니라 해당 파일명을 같이 출력해 준다. 파일명과 문자열은 콜론(:)으로 구분된다.

 

grep -H abcd my_memo.txt

my_memo.txt:abcdef

 

문자열은 필요 없고 파일명만 확인하고 싶다면 아래와 같이 -l 옵션을 추가하자.

 

grep -Hl abcd my_memo.txt

my_memo.txt

 

자, 이제 특정 디렉토리와 그 하위 디렉토리에 있는 여러개의 파일들 중에 특정한 문자열을 포함한 파일이 있는지 찾고 파일명을 확인해 보자. -r 옵션(recursive)을 이용하고 파일 대신 디렉토리를 지정하면 된다. 아래의 예시는 ~/Documents 디렉토리의 모든 파일을 검색, 내용에 abcd가 포함된 파일 찾아 파일명을 출력하는 경우이다.

 

grep -Hlr abcd ~/Documents

 

만약 특정 파일만 골라서 확인하고 싶다면 --include 옵션을 추가한다. 아래의 예시는 확장자가 txt인 파일만 대상으로 검색하는 경우이다.

 

grep -Hlr --include=*.txt abcd ~/Documents txt

 

파일 중에 v로 시작되는 파일은 제외하고 검색하려면 여기에 --exclude 옵션을 추가.

 

grep -Hlr --include=*.txt --exclude=v* abcd ~/Documents

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 12. 2. 15:28

 

반달가면 이글루에서 백업 - bahndal.egloos.com/465115

 

조건에 맞는 파일을 찾아 특정 디렉토리로 복사를 하고 싶을 경우, find와 cp 명령을 xargs 명령으로 연결하면 되겠다.

파일을 찾기 위한 find 명령에 대한 내용은 이전 게시물을 참고하자.

 

우선 홈디렉토리(~/)에서 확장자가 txt인 파일을 찾는 예시를 보자.

 

find ~/ -type f | grep "\.txt$"

 

자, 이 결과를 가져와서 cp 명령을 실행해야 한다. 앞에 실행한 명령의 결과를 뒤에 실행할 명령의 인자(argument)로 넘겨주는 xargs 명령을 이용하는데, 한가지 유의할 점이 있다. 아래의 예시를 보자.

# txt 파일을 찾아 ~/Documents 디렉토리로 복사 (잘못된 시도)

find ~/ -type f | grep "\.txt$" | xargs cp ~/Documents

# 실패!

 

위와 같이 하면 제대로 복사가 되지 않는다. cp 명령에서 복사하려는 목적지 디렉토리와 앞의 find 명령에서 넘어온 파일 목록이 혼동되지 않도록 반드시 -t 옵션을 사용해야 한다. 제대로 된 예시는 아래와 같다.

 

# txt 파일을 찾아 ~/Documents 디렉토리로 복사(성공)

find ~/ -type f | grep "\.txt$" | xargs cp -t ~/Documents

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 11. 16. 17:29

 

반달가면 이글루에서 백업 - bahndal.egloos.com/451182

 

grep의 문자열 검색 기능을 매우 강력하지만 기본적으로 특정 문자열이 "포함된" 행을 찾아내는 것이다. 특정 문자열에 정확히 일치하는 항목이 있는지를 찾으려면 일이 약간 복잡해 진다.

 

일단 my_file.txt 파일의 내용이 아래와 같다고 생각해 보자.

 

john

john_smith

my name is john smith

my name is john_smith

 

일단 포함 여부가 아니라 행 전체가 일치하는 경우를 찾아야 한다면 -x 옵션으로 간단히 해결할 수 있겠다.

 

cat my_file.txt | grep -x "john"

john

 

또는 정규표현을 이용해도 된다. j로 시작되고(^j) 그 다음에 ohn이 있고 마지막에 n으로 끝나게(n$) 되는 문자열을 찾는 것이다.

 

cat my_file.txt | grep "^john$"

john

 

위 방법은 탭이나 공백이 포함되어 있을 경우에 문제가 될 수 있다. 예를 들어 my_file.txt의 john이라는 행이 john[공백] 이런 식이면 위의 방법으로는 검색이 안된다. 아니면 공백이 있다는 것을 미리 알고 grep의 인자에 반영해야 한다.

 

cat my_file.txt | grep -x "john "

 

탭이 포함된 경우라면 이런 식으로 반영하긴 어렵고 awk를 써야 한다. (탭이 포함된 문자열 검색은 이전 게시물을 참고하자.)

 

그렇다면 행 중간에 있는 특정 문자열을 정확하게 찾으려면 어떻게 할 것인가? 위의 my_file.txt에서 john_smith는 제외하고 john만 찾고 싶은 경우인데, grep의 정규표현과 이전에 게시했던 다중 문자열 검색 방법을 활용해 볼 수 있다.

 

정규표현 중에 [[:graph:]]라는 것이 있다. 화면에 표시할 수 있는 모든 문자(영문 대소문자 + 수자 + 특수기호)를 지칭한다. 공백은 제외된다. 공백도 포함하는 표현은 [[:print:]]이다.

 

자, 이제 아래의 예를 보자.

 

cat my_file.txt | grep "john" | grep -v "[[:graph:]]john\|john[[:graph:]]"

john

my name is john smith

 

우선 john이 포함된 행을 골라낸 후, john 앞에 다른 문자가 붙은 경우([[:graph:]]john) 또는(\|) john 뒤에 다른 문자가 붙은 경우(john[[:graph:]])를 -v 옵션으로 제외시킨 것이다.

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 22. 12:17

 

반달가면 이글루에서 백업 - bahndal.egloos.com/418681

 

텍스트 파일에서 2개 이상의 문자열을 검색하는 방법이다.

(A and B) 일단 A라는 문자열과 B라는 문자열이 모두 포함된 행을 찾는 것은 간단하다. 파이프(|)를 이용해서, A가 포함된 뿐을 골라낸 후에 거기서 B를 골라내면 된다.

 

cat file.txt | grep A | grep B

 

(A or B) A 또는 B가 포함된 행을 찾으려면 A와 B를 파이프(|) 기호로 연결하면 된다. 연산자로 인식하도록 역슬래시(\)를 붙여준다.

 

cat file.txt | grep "A\|B"

 

또는 egrep 명령을 활용해도 된다. 작은따옴표(')와 괄호를 이용한다.

 

cat file.txt | egrep '(A|B)'

 

만약 shell script에서 변수에 할당된 문자열을 사용하려고 한다면 egrep으로는 어렵고 앞에 언급한 파이프 기호를 이용해야 한다.

 

str_a="1st string"

str_b="2nd string"

cat file.txt | grep "$str_a\|$str_b"

 

Posted by 반달가면

댓글을 달아 주세요