찾기를 사용할 때 여러 명령을 어떻게 실행합니까?


57

내가 찾은 것들에 대해 여러 명령을 실행하려고하는데 어떻게 이것을 달성 할 수 있습니까?

find . -exec cmd1; cmd2

작동하지 않는 것 같습니다. 대신 모든 파일에서 cmd1이 실행 된 후 cmd2를 실행합니다.

답변:


40

이 데모에서는 첫 번째 sh -c 'echo first; false'(또는 true)를 사용합니다 -exec. 그러면 일부 출력이 제공되고 선택된 종료 코드 효과도 있습니다. 그런 다음 echo second두 번째에 사용됩니다. 현재 디렉토리에 하나의 파일이 있다고 가정하십시오.

$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second

이 유형의 실제 명령은 다음과 같습니다.

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)

두 번째 세트에서 이스케이프 된 괄호는 두 -exec절을 그룹화합니다 . -false사이에는 "FALSE"이고 위해 시험 상태 강제 -o원인은 다음 식 (제를 -exec때문으로 평가 함) -false.

보낸 사람 man find:

expr1 expr2
행의 두 표현식은 내포 된 "and"로 결합됩니다. expr1이 false이면 expr2는 평가되지 않습니다.

expr1 -a expr2 expr1 expr2
와 동일합니다.

expr1 -o expr2
또는; expr1이 true이면 expr2는 평가되지 않습니다.


아 그래, 나는 잊었다 -o.
Ignacio Vazquez-Abrams

32

cmd1이 오류 코드로 인해 cmd2가 실행되는 것을 막을 수 있는지에 대해 중요하지 않은 경우 0:

find . -exec cmd1 \; -exec cmd2 \;

두 명령을 항상 실행하는 신뢰할 수있는 유일한 방법은 명령을 find순차적으로 실행하는 쉘을 호출하는 것입니다.

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

2

cmd1 및 cmd2를 수행하는 스크립트를 작성하는 것이 마음에 들지 않으면 다음과 같습니다.

find . -exec myscript {} \;

또는

find . -exec myscript {} +

사용하다 \; 또는 + myscript가 한 번에 두 개 이상의 파일을 처리 할 수 ​​있는지 여부에 따라 (파일 이름에 공백이 있으면 털이 나타남)

내 경험에 따라 스크립트에서 수행 한 작업을 수행하는 것은 거의 항상 가치가 있습니다. 한 번만해야하는 경우 다시해야합니다.

그러나 깔끔한 트릭은 찾기 스크립트 안에 넣는 것입니다 .

if [ $# -gt 0 ]; then
    for each; do
        touch $each
    done
else
    find . -exec $0 {} +
fi

그런 다음 myscript는 작업하기 위해 인수로 제공하는 모든 파일에서 작동하지만 인수를 제공하지 않으면 현재 디렉토리에서 찾은 다음 찾은 파일에서 자신을 호출합니다. 이것은 find -exec가 스크립트에서 정의한 쉘 함수를 호출 할 수 없다는 사실을 해결합니다.


0

나는 많은 행운을 빕니다. 이것은 나를 위해 잘 작동했습니다.

$ for i in `find . -exec echo {} \;`; do cmd1 $i; cmd2 $i; done

파일 목록이 너무 크면 작동하지 않습니다.
Alex

-3

명령을 시도하십시오 :

sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l

4
어, 그건 좋은 생각이 아닙니다. *-exec부분은 현재 디렉토리에있는 모든 파일에 확장됩니다. 특히로 실행할 때 sudo.
slhck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.