UNIX find 명령을 어떻게 마스터합니까?


11

나는 찾기를 사용하는 데 상당히 진보했다고 생각하지만 그것을 사용할 때마다 나는 내 인생에서 -exec 옵션을 닫는 방법을 기억할 수 없다. 나는 그것을 사용할 때마다 많은 시간을 읽는다. 나는 그것을 충분히 사용하지 않거나 너무 많은 것을 기대하고 있습니까? 나를 실망시키는 전형적인 예부터 시작합시다.

디렉토리 구조에 모든 잘못된 권한이있는 파일 숨김 파일 기호 링크 등이 있습니다. 소유권을 합리적인 값으로 변경하고 싶습니다.

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(엔딩이 거꾸로되어 있다면 나를 옹호하십시오 ... 한 시간 전에 봤지만 여전히 확실하지 않습니다)

그러나 나는 마운트, 심볼릭 링크 등으로 인해 그것을 실행하는 것이 무섭습니다. 나는 chmod를 궁극적으로 사용했습니다. * 나는 -xdev가 파티션을 넘지 않을 것을 알고 있지만 심볼릭 링크 인 디렉토리에있는 파일에 어떤 일이 일어날 지 잘 모르겠습니다.

그렇다면 중요한 파일을 죽일 수있는이 짐승을 어떻게 마스터합니까?

업데이트 아래에 최선의 제안을 치기 및 요약 :

  1. 연습 디렉토리를 다른 연습 디렉토리에 링크하고 마운트하십시오.
  2. 직관적이지 않은 exec 명령 대신 xargs를 사용하십시오.
  3. 위생 및 안전을 위해 -exec echo {} 사용
  4. 세미콜론은 특별하고 탈출하고 있으므로 탈출 문자가 먼저입니다.
  5. -또는 명령을 사용하면 선택 기준을 결합 할 수 있습니다.

나는 print0에 대해 약간 혼란 스럽지만 xargs는 항상 시도하고 피하는 언뜻보기에 이해하기 쉽지 않습니다.


1
나도 그것을 기억할 수 없으므로 xargs에 파이프로 연결합니다.
공명기

2
올바른 명령을 작성하는 데 만족하면 \ 대신 +로 실행하십시오. exec 명령이 덜 자주 호출되기 때문에 +로 더 빠르게 실행됩니다.
wzzrd

wzzrd, \보다는 +를 사용하는 것에 대한 좋은 팁;
Daniel Lawson

답변:


19

글쎄, -exec구문이 진행되는 한 많은 사람들을 좋아하고 포기하고 사용할 수 있습니다 xargs.

find . -type f | xargs chown username

(또는 공백이 포함 된 파일 및 기타 안전하지 않은 파일 버전)

find . -type f -print0 | xargs -0 chown username

또는, 세미콜론 (;)으로 옳은 일을 기억하려고, 당신은 당신의 머리에 드릴 필요는 세미콜론을 사용하고 있다는 것입니다 종료 명령 -exec실행을, 당신은 할 필요가 탈출 그것이 특별한을 가지고 있기 때문에 세미콜론 의미합니다 bash. 이것이 백 슬래시 세미콜론 인 이유입니다. {}대체 부분은 괜찮은 것 같습니다 .

파일을 죽이는 것과 관련하여 이야기하는 것과 같이 크고 위험한 것을 실행하는 경우 먼저 다음을 수행하십시오.

find . -type f -exec echo chown username {} \;

결과를 검토하십시오. 이것은 기본적으로 "드라 이런 (dry run)"으로, 명령을 내릴 경우 실행되는 명령을 볼 수 있습니다. 확실히 좋은 연습입니다. .*문제에 도움이되지 않지만 지금은하지 말아야합니다. :)


1
+! '에코'연습 드라이 런. 나는 항상 큰 변화를 위해 이것을 사용합니다
Steve Folly

3

아무도 다음 옵션을 아직 언급하지 않은 것에 놀랐습니다.

find . -type f -ok chown username {} \;

이 구문은 명령을 실행하기 전에 확인합니다. 각 파일에 대해 프롬프트를 표시하므로 일치하는 파일 수가 상대적으로 적을 것으로 예상하는 경우 가장 효과적입니다.

일부 답변은 언급 xargs하지만 GNU를 사용하면 너무 불필요하다는 것을 알 수 있습니다.

find . -type f -exec chown username {} \+

+는 일반적으로 탈출 할 필요는 없지만 어쨌든 습관을들이는 것이 좋습니다.


더하기 부호의 특성을 설명 할 수 있습니까? 정확히 무엇을하고 있습니까? 쉘이 처리하거나 명령을 처리합니까? 흥미로운 주제이기 때문에 gnu-find의 소스 코드를 다운로드하려고 생각합니다.
ojblass

찾기가 처리 중입니다. 해당 옵션에 대해 자세히 알아 보려면 man find를 읽으십시오.
Kamil Kisiel

3

이것은 사람이하는 일입니다. 기억하기가 어려울 수 있으므로 * nix 명령에 매뉴얼 페이지가 포함됩니다. 맨 페이지의 ACTION 섹션에서 구문에 대한 알림을 항상 확인할 수 있습니다 man find. 매뉴얼 페이지가 친숙하지 않은 것처럼 보일 수 있지만 일단 읽어 보면 매우 편리합니다.

프론트 엔드 또는 래퍼 만들기 : GNU find에서 더 나아지 기를 원할 때 python, glade 및 pygtk로 find 명령을 생성하는 find 용 GUI 프론트 엔드를 작성했습니다 . 정말 잘 알고 싶다면 좋은 운동입니다.

실습 디렉토리를 갖자 . 마지막으로, 'echo'와 같은 것이 잘리지 않을 때 강력한 명령을 사용하기 위해 항상 홈 디렉토리에 '스크랩'디렉토리가 있습니다. 쉘 확장을 사용하여 다음과 같은 파일을 신속하게 만들 수 있습니다.

for i in {1..100}; do touch "$i"; done

연습 디렉토리가 이상하다고 생각한 적이 있습니다.
ojblass

1

찾기 표현식을 '-and'및 '-or'연산자와 결합 할 수도 있습니다. 그리고 암시 적입니다.

find . -type f -name "plainfile" ...

와 같다

find . -type f -and -name "plainfile" ...

또는 연산자는 4 개의 명령 목록을 2로 줄일 수 있습니다.

find . -type d -or -type f ...

그리고 마지막으로 찾기와 관련이 없지만 chown도 그룹을 설정할 수 있습니다. 따라서 이름의 공백에도 대처하면 다음과 같이 끝납니다.

find . -type d -or -type f -exec chown username:usergroup '{}' \;

비즈니스에서 찾은 것 [Sic]
ojblass

@ojblass : find는 'and'또는 'or'를 사용하여 표현식을 결합합니다. 기본적으로 '-and'또는 '-or'를 지정하지 않으면 '-and'가 암시 적으로 사용됩니다. 따라서 'find -type d -type f'유형은 디렉토리 파일 이 없기 때문에 아무것도 찾지 않습니다 .
Steve Folly 2018 년

0

닫을 때 나는 단지; 많은 프로그래밍 언어를 사용하고 탈출하는 것과 같습니다. 탈출해야한다는 것을 기억하십시오. 그리고 그것은 당신에게 아주 쉽게옵니다.


0

사용중인 찾기 버전에 따라 다른 옵션이 도움이 될 수 있습니다. GNU find는 아마도 가장 강력 할 것이며 두 번째 (암시 적) 질문에 도움이 될 것입니다

예를 들어-기본 동작은 심볼릭 링크를 역 참조하지 않지만이를 무시할 수 있습니다. -mount 옵션은 마운트 지점에서 찾기를 중지합니다.

지역 매뉴얼 페이지를보십시오


0

어떤 사람들 은 xargs 옵션이 각 파일에 대해 한 번만 명령을 실행하지 않기 때문에 -exec 옵션보다 빠르다고 주장 하지만 사소한 시간이 걸리지 않는 대량 작업을 제외하고는 걱정하지 않아도됩니다.

개인적으로 저는 보통 exec없이 find를 실행합니다.

find /path/to/dir -name whatever

출력이 올바른지 확인한 다음 해당 목록에서 내 명령을 실행하십시오.

chown user:group `find /path/to/dir -name whatever`

일을하지 않는 방법의 완벽한 예. 공백이있는 파일 이름.
Ian Kelling

그렇습니다, 그것은 아마도 내가 인정했을 잠재적 인 문제입니다. 그러나 내 요점은 공백이나 다른 파일 이름 광기를 발견 할 수있는 것을 실행하기 전에 찾기 출력을 읽는 것에 관한 것입니다.
theotherreceive

0

bash가 아닌 일부 쉘의 경우 올바른 동작을 위해 {}을 이스케이프하십시오.

\{\} or '{}'

찾기 매뉴얼은 찾기 마스터 링에 좋습니다.


아닙니다. {}을 그대로 사용하면됩니다. 이들은 find 명령의 일부입니다. find 명령의 결과로 대체되는 토큰입니다. 함수를 정의하거나 변수를 호출 할 때 bash에 무언가를 의미하기 때문에 원래 질문에서와 같이 사용할 수 있습니다.
wzzrd

맨 페이지에서 가져온 것입니다. 나는 bash에 적용 할 수 없다고 말하면서 업데이트했다.
Ian Kelling

0

이와 같은 작업을 수행하기 전에이 명령을 실행하는 디렉토리가 / usr 또는 / etc와 동일한 파일 시스템에 있지 않은지 확인하십시오. (그렇지 않으면 내 홈 디렉토리에 / etc / passwd 또는 / bin / sh에 대한 하드 링크가있는 경우 방금 소유권을 부여했으며 부작용으로 기계를 소유하고 있습니다).

디렉토리를 통해 재귀를 원하고 모든 파일 / 디렉토리를 숨기려면 간단한

chown -Rh 사용자 : 사용자 그룹 사용자 /

할 것입니다. 확인 하십시오 당신이 -h를 사용하거나 대한 Chown이 심볼릭 링크를 따릅니다.


나는 이것이 크로스 플랫폼이라고 생각하지 않습니다. 내 연습 환경에서 설명하는 것처럼 247K의 파일로도 실패합니다. 왜 그런지 잘 모르겠습니다.
ojblass

크로스 플랫폼 문제를 발견 한 것보다 더 많은 버그를 발견 한 것 같습니다. 실패했을 때 어떤 버전과 종료 상태입니까? 내가 처음으로 알 수있는 한 초기 bsd 버전에서 시작되었습니다. 분명히 sunos 5.3과 ultrix 및 irix에 있습니다. 실패하기 전에 몇 개의 프로세스를 처리합니까?
chris

AIX 5.3, AIX 5.2에서는 작동하지만 AIX 4.3, NCR, HP 11, HP 10.20 또는 DSL 배포에서는 작동하지 않습니다. 모든 경우에 60k 파일 또는 그 근처에서 실패한 것으로 보입니다.
ojblass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.