Linux 명령에서“{} \;”은 무엇을 의미합니까?


37

때로는 다음 명령이 표시됩니다.

find . -name  * -exec ls -a {} \;

나는 이것을 실행하도록 요청 받았다.

여기서 무엇을 {} \;의미합니까?


1
-name *중복됩니다.
Kevin

3
이와 같은 다른 유형의 질문에 대해서도 Explainshell 을 확인하십시오 . 다음은 명령 출력입니다. .
Glutanimate

8
-name *여분보다 나쁘다. *따옴표가 없기 때문에 셸은 현재 폴더의 파일 이름 목록으로 확장하여 공백을 잘못 처리하여 예기치 않은 결과 나 오류 메시지를 발생시킵니다. 추가 포인트로서 find많은 기능이 있으며 그중 하나는 파일을 나열하는 것입니다. 이것은 사용하지 않아도됩니다 -exec. 예를 들어 find . -print또는 을 사용할 수 있습니다 find . -ls. 마지막으로 세미콜론을 이스케이프 처리하는 방법에는 백 슬래시 \;를 사용하거나 따옴표를 사용하여 두 가지 방법이 있습니다 ';'. 더 편하게 느끼는 것을 사용하십시오.
Paddy Landau

답변:


48

당신이 실행하는 경우 findexec, {}각 파일이나 디렉토리가 발견의 파일 이름으로 확장 find(그래서 ls당신의 예에서 인수로 모든 FOUND 파일 이름을 얻는다 - 그것은 호출하는 것으로 ls각 파일을 찾을에 대한 일단 사용자가 지정한 다른 어떤 명령).

세미콜론 ;은에 의해 실행 된 명령을 종료합니다 exec. 내부에서 \실행하는 쉘이 find자신의 특수 문자로 취급하지 않고에 전달 하도록 탈출 해야합니다 find.

자세한 내용은 이 기사 를 참조하십시오.


또한, 이와 같이 실행할 때 파일 당 한 번만 호출하지 않고 찾은 파일을 명령 끝에 추가하여 (가능한 경우 명령이 한 번만 실행되도록) find최적화를 제공합니다 .exec cmd {} +find

실행하면 행동의 차이는 (안 효율 경우) 쉽게 눈에 띈다 ls, 예를 들어,

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

충분한 경로 를 가진 일부 jpg파일 이 있다고 가정하면 첫 번째 경우 파일 당 한 줄이고 파일을 열로 파일을 표시하는 표준 동작입니다.ls


1
나는 당신과 대조 \;하는 것이 도움이 될 것이라고 생각합니다 +.
Kevin

어떻게 다른 find . -name * | ls -a -가요?
András Hummer

@DrH 요점은 쉘이 와일드 카드 확장을하도록하는 것이 아니라 와일드 카드 표현식을로 전달하는 것 find입니다. 또한, 출력 ls에 상관없이 내가하는 필터로 무엇을 사용 -이 경우에는 분명히 입력에 의존하지 않고 find, ls단지 표시 작업 디렉토리의 내용과 그게 다야. 예를 들어 확인 find ~ -iname '*.jpg' -exec ls -a {} \;find ~ -iname '*.jpg' | ls -a.
moon.musick

@DrH 또는 심지어 echo 'foo' | ls -a.
moon.musick

@ moon.musick, @ dr-h가 무엇을 쿼리했는지 테스트 할 때 명령 에서 중요한 부분 -을 놓쳤다 고 생각합니다 ls -a -.
Daniel Llewellyn

20

로부터 에 대한 맨 페이지 find명령맨 페이지 아이콘 :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the shell.

설명은 다음과 같습니다.

{}"의 출력"을 의미합니다 find. "무엇이든 find발견". find찾고있는 파일의 경로를 반환합니다. 따라서 {}그것을 대체하십시오. find명령이 찾는 각 파일의 자리 표시 자입니다 ( 여기 에서 가져옴 ).

\;부분은 기본적으로 find"알겠습니다. 실행하고 싶은 명령으로 끝났습니다"라고 말합니다.

예:

내가 .txt파일로 가득 찬 디렉토리에 있다고 가정 해 봅시다 . 그런 다음 실행합니다.

find . -name  '*.txt' -exec cat {} \;

첫 번째 부분 find . -name *.txt.txt파일 목록을 반환 합니다. 두 번째 부분은, -exec cat {} \;실행]됩니다 cat에 의해 발견 된 모든 파일에 대한 명령을 find하므로, cat file1.txt, cat file2.txt, 등.


4
부품 *.txt은으로 인용해야합니다 '*.txt'. 이것이 있다면.txt현재 폴더에 파일 셸이이를 확장하여 잘못된 결과 나 오류 메시지가 표시 입니다. find -name '*.txt' -exec cat {} \;
Paddy Landau

@Alaa Ali는 매우 잘 설명했습니다
pushya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.