find: 디렉토리를 찾되, 현재 디렉토리(.) 는 결과에서 제외하려면?

** 아래 글, 또 바보짓 했다. 이래서 밤에는 이런 작업을 하면 안되는 건데..
chmod -R g+s 명령을 내리게 되면, 하부 ‘파일’에까지 setgid 가 붙어 버리고, 이건 내가 원하는 결과가 절대로 아니다.
나중에 글을 고치겠지만, maxdepth 를 빼버려야 제대로된 결과가 나올 듯 하다.

……


늘 이런 일이 있을 때마다 느끼는 거지만, 원하는 결과를 얻기 위해 하나씩 수동으로 처리했다면, 자동화하려고 애쓰는 노력보다 훨씬 짧은 시간에 끝냈을 거라는 생각이 든다.
예를 들면 이런 거다.
한 디렉토리 안에 있는 여러 디렉토리들의 소유권을 바꾸려고 한다.
그런데, 모든 디렉토리를 바꾸는 게 아니고, 그중 ‘몇몇’ 디렉토리만 바꾸려고 한다.

일단, 원하는 디렉토리를 찾는 명령부터 생각해보자.

find . -type d

현재 디렉토리 아래에 있는 모든 디렉토리를 찾아 출력해준다.
그런데, 소유권을 바꾸긴 할테지만, 현재 디렉토리에 아래에 있는 ‘모든’ 디렉토리를 다 찾을 필요는 없다. 현재 디렉토리 아래, 딱 한단계만 디렉토리명을 알아내면 된다. chown -R 을 사용할 예정이기 때문이다.
그렇다면 명령은 이렇게 바뀐다.

find . -maxdepth 1 -type d

maxdepth 를 맨 앞에 써주지 않으면 뭐라 뭐라 불평을 한다.
그리고, 내가 원하는 조건은 하나가 더 있는데, 이들 디렉토리 중, 특정 그룹이 소유하고 있는 디렉토리만을 원한다.

find . -maxdepth 1 -type d -group abcxyz

이제, 현재 디렉토리 바로 아래에 있는, ‘abcxyz’ 그룹에 소유권이 있는 디렉토리만 나열이 된다.
예를 들면 이렇게.

find . -maxdepth 1  -type d -group abcxyz
.
./Book
./Game
./Music
./Old
./Terrible
./Major
./Baseball
./test1
./test2

다 잘된 거 같은데..?
그러나 그렇지 않다.

공교롭게도, 현재 디렉토리, 즉 ‘.’ 도 abcxyz 소유이기 때문에, find 를 하고 그 결과에 대해 명령을 내리면, 저렇게 find 를 한 수고가 무위로 돌아가게 된다.
뭔 말이냐 하면..

find . -maxdepth 1 -type d -group abcxyz -exec chown -R :efghij {} \;

이렇게 하려고 했다 치자.
find 탐색으로 인한 결과인 Book, Game, Music … 등등 디렉토리의 소유권을 efghij 로 바꾸려고 했다.
헌데, find 결과에 Current Directory(즉, ‘.’)가 포함되어 있기 때문에, 현재 디렉토리 이하 모든 파일의 소유권이 바뀌어 버린다.
애써서 find 로 범위를 좁혔지만, 헛수고가 되어 버렸다.

자.. 이제 본론.
find 결과에서 현재 디렉토리가 표시되지 않게 하려면?
! -path . 을 추가한다.

find . -maxdepth 1 ! path . -type d -group abcxyz -exec chown -R :efghij {} \;

이 방법이 최선인지는 모르겠으나, 적어도 내가 원하는 목적은 이루어낼 수 있었다.
다음 글을 참고했다.

위 글 중, mindepth 를 쓰는 방법은 내가 하려고 하는 작업과는 맞질 않았다. 호환성 문제가 있는 걸까.

Tags:

안녕하세요. 글 남겨주셔서 고맙습니다.