2009-03-22 3 views
10

찾기 명령이 다른 유닉스 명령과 다른 것 같습니다.명령 구문을 이해할 수 없습니다. 찾기

다음 명령 끝 부분에 빈 중괄호와 역방향 플래시가있는 이유는 무엇입니까?

find * -perm 777 -exec chmod 770 {} \; 

나는 중괄호뿐만 아니라 이전 버전과 플래시에 대한 이유를 발견했다.

중괄호 제외하고, 경로를 분명히 간부로

동일한 지``{} '' 유틸리티

을 각각의 호출에 대한 가능한 한 많은 경로 이름으로 대체 입니다
+2

중괄호는 마지막 인자로 파일 이름을 기대하는 (또는 필요)하지 않는 명령을 실행할 수 있습니다. 중괄호를 사용하여 원하는 곳 어디에서나 파일 이름을 삽입 할 수 있습니다. 심지어 실행할 프로그램의 이름으로도 사용할 수 있습니다! –

+0

가능한 단순 복제본 명령, {} 및 \; for] (http://stackoverflow.com/questions/447048/simple-unix-command-what-is-the-and-for) – kenorb

답변

2

내가 대신

find . -perm 777 -print0 | xargs -0 chmod 770 

"xargs를"이 발견의 결과를 가지고 다음 명령을 한 번에 그 (20)를 공급 말한다 않는 것이 좋습니다 것입니다.

+1

한 번에 20 개? 누가 그래? –

+0

man xargs (버전 4.4.0)에는 번호 20이 없습니다.이 동작은 -n20과 함께 xargs를 호출하여 시행 할 수 있습니다. – Stephan202

+0

"한 번에 20 회"는 일종의 평균이었습니다. 그것은 POSIX에서 512 바이트 길이라고 생각하는 일반적인 명령 행에 맞을 수 있다고 생각하는만큼 실제로 많은 수입니다. –

16

-exec 명령 뒤에는 발견 된 각 파일에 대해 실행될 명령을 구성하는 인수가 여러 개있을 수 있습니다. 마지막 인수를 식별 할 수있는 방법이 필요합니다. 이것은 무엇을 \; 않습니다. 다른 일들이 간부 스위치 다음에 따를 수 있습니다 : (. 이것은 오일러 디렉토리에있는 모든 C-파일과 파이썬 파일을 찾습니다)

find euler/ -iname "*.c*" -exec echo {} \; -or -iname "*.py" -exec echo {} \; 

를 Exec에서의 전체 명령을 필요로하지 않는 이유는 따옴표 안에 있으면 대부분의 상황에서 명령 내에서 많은 인용 부호를 이스케이프해야합니다.

3

"찾기"는 exec'd 프로그램의 끝 부분 (있는 경우)이 끝나고 "찾기"가 시작될 추가 인수를 알 수 있도록하기 위해 (이스케이프 된) 세미콜론이 필요합니다.

6

문자열 {} (find)은 현재 파일의 경로 이름으로 바뀝니다.

세미콜론은 find 유틸리티에 의해 호출 된 쉘 명령을 종료하는 데 사용됩니다.

;은 쉘 (목록 연산자)에서 사용하는 특수 문자 중 하나이기 때문에 이스케이프하거나 인용해야하므로 쉘에서 해석하지 않습니다.

은 참조 : Why are the backslash and semicolon required with the find command's -exec option?

관련 문제