'find -exec'를 다른 'find -exec'내에 중첩시킬 수 있습니까?


14

다음과 같은 것이 내가 추구하는 것입니다.하지만 탈출 {}과 방법에 관계없이 코드가 작동하지 않습니다.+ ;

find ./ -maxdepth 1 -type d -name '.*' -exec \
    find {} -maxdepth 1 -type f -name '*.ini' -exec \
        md5sum \{\} \\; \;

이보고 후 & - - 유닉스 리눅스 질문에 , 나는 다음과 같은 코드가 작동 발견,하지만 중첩되지 않습니다 발견 과 같은, 나는이 특별한 일을 할 수있는 더 좋은 방법이 생각한다.

find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
    find "$x" -maxdepth 1 -type f -name "*.ini" \
    -exec md5sum \{\} \;; \
done' _ {} \+

find -exec엉뚱한 따옴표와 이스케이프 제약 조건으로 쉘을 호출 할 필요없이 중첩 할 수있는 방법이 있습니까?

아니면 많은 매개 변수를 혼합하여 단일 찾기 명령으로 직접 수행 할 수 있습니까?


4
원하는 것을 할 수는 있지만 상황이 복잡해지면 쉘 또는 Perl 스크립트로 전환합니다. 두 번째 코드 스 니펫은 쉘 스크립트 인라인에서만이 작업을 수행합니다. 영웅적인 원 라이너는 재미 있지만 이해하기 어렵고 유지하기가 어렵습니다. 그럼에도 불구하고 이것이 일회성 거래가 아니라면 지적 도전 이외의 다른 이유는 없습니다.
워렌 영

1
@Warren 젊은 : 나는 확실히 개념은 복잡한 생각하지 않습니다,하지만 난 당신이 더없는 의미 가정 간단한 과에서 할 방법이 find있지만, 경우 find이 작업을 수행 할 수 없습니다, 다음 왜 find그렇게 존경 (?) 도구 -로 파일을 찾는 데 사용할 수 있습니까? ... 나는 find ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+내 상황에서 잘 작동 한다는 것을 아는 것으로 나타났습니다 (jw013의 참조가 -prune맨 페이지에서 이를 이끌어 냈습니다). 필자는 거의 모든 필요한 작업을 수행 한 find것처럼 (1 년 미만의 Linux) 실제로 사용한 적이 없으므로 locate알 수없는 영역입니다.
Peter.O

1
-path시험은 내가 제안가는 정확히 것입니다. 이것으로, 당신은 당신이 원하는 모든 것을 할 수 있어야 합니다. (Ace Of Base 협회에 유감입니다))
rozcietrzewiacz

답변:


8

다음과 같은 단일 찾기를 사용하려고합니다.

find .*/ -maxdepth 1 -type f -name '*.ini' -execdir md5sum {} +

또는 짝수 (아무도 find셸 글 로빙)

md5sum .*/*.ini

이것은 -type f검사가 없기 때문에 끝나는 디렉토리 / 파일이없는 경우에만 작동합니다 .ini. 당신이 할 수 있다면

for x in .*/*.ini; do 
    if [ -f "$x" ]; then 
        md5sum "$x"
    fi
done

그러나 단 하나의 md5sum 호출 만 있으면 이점이 사라집니다.

편집하다

일반적이고 안전한 체인 연결 방법을 find위해 다음과 같은 작업을 수행 할 수 있습니다

find <paths> <args> -print0 | xargs -0 -I{.} find {.} <args for second find> [etc.]

내가 가진 오류 -f(? F) 다음에 다른 오류 -execdir내가 교체 할 때 .. -execdir 간부로, 및 / 또는도 인쇄와 md5sum이 교체, 나는 아무것도 얻을 ..
Peter.O

대안에 대해 감사합니다 ...하지만이 방법을 사용하여 더 많은 방법을 사용하고 있습니다 find...이 예제를 해결하고 싶지는 않지만 find-fu 방법에 대한 통찰력을 찾고 있습니다. .. 찾을 수있는 fu보다 더 많은 플러 프가있을 수 있습니다. (실제로는 사용하지 않았기 때문에 모르겠습니다.) 이것이 실제로 이미지 파일에 사용하고 싶었던 첫 번째 상황입니다. 내가 들었던 -exec 기능은 rep (?)가 암시하는 것처럼 강력하지는 않지만 ... (그러나 대안의 경우 +1) ..하지만 find예제는 작동하지 않습니다 (여전히 )
Peter.O

find명령에 대해이 오류가 발생합니다 : ... find: The relative path ~ / bin '은 PATH 환경 변수에 포함되어 있으며 find의 -execdir 조치와 함께 사용하면 안전하지 않습니다. $ PATH에서 해당 항목을 제거하십시오. .... 아마 작동 할 것입니다.하지만 잠시 동안 ~ / bin을 제거하려고했다고 말해야합니다. 더 많은 것을 가져 가야합니다. 진지하게 봐 .. 내가 어디에 설정했는지 모르겠다 ... 숨어 있을지도 모르는 아이디어; ~/bin내 PATH에
Peter.O

나는 find전적으로 할 수없는 상황에서 그 힘 이 가장 높이 평가된다고 생각 하지만, 그러한 상황이 드물기 때문에 나는 일반적으로 많이 찾을 필요가 없습니다.
jw013

좋아요 .. 흥미롭고 좋은 점입니다. (globs 사용에 대한) ...
Peter.O

2

원래 문제는 재귀 적으로 찾기 호출을 요구하지 않지만 그 점이 아니라고 생각합니다.

원하는 방식으로 찾기를 재귀 적으로 호출하는 것은 불가능하다고 생각합니다.

다음은 find를 재귀 적으로 호출하지 않거나 호출하는 것이 아니라 첫 번째 찾기의 결과 집합을 가져 와서 두 번째 항목으로 공급할 수는 없습니까? 이것이 내가 본능적으로하는 방법입니다.

find `find ./ -maxdepth 1 -type d -name '.*'` \
    -maxdepth 1 -type f -name '*.ini' -exec md5sum {} \;

당신은 또한 사용할 수 있습니다 xargs두 번째 찾기 실행 .

최신 정보:

나는 대부분의 유닉스 유틸리티가 하나 대신 여러 개의 파일 이름 인수를 취하기 때문에 일반적으로 피할 수 있다고 -exec덧붙였다.

md5sum `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`

백틱을 중첩 할 때는 백 슬래시 만 추가하면됩니다. \ 내부 앞에 를 됩니다.

md5sum파일 이름 인수가 하나만 필요 하다고 생각되면 항상 for루프로 래핑 할 수 있습니다 .

for f in `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`
do
    md5sum $f
done

-공백으로 시작 하거나 공백을 포함하는 파일 / 디렉토리 이름이 포함 된 경우 이는 더 어려워집니다 . 유닉스 유틸리티는 잘 작동하지 않습니다. 이 경우 ./,-- 또는 따옴표를 해야합니다.

분명히 원래 예제는 좋지 않습니다.

md5sum .*/*.ini

1
상황에 대한 좋은 개요를 제공했지만 파일 / 디렉토리에 공백이 포함 된 경우 표시된 모든 find메소드에 오류가 발생 합니다 ... md5sum .*/*.ini작동합니다. 나는 일반적인 느낌을 갖기 시작했습니다. '복잡한'것에 대한 의견은 find게임 초기에 발생합니다 :), 그러나 find조건 테스트가 더 복잡 할 때 자체적으로 발생 한다고 가정 하지만 중첩-실행이 진행되는 한 아이디어를 떨어 뜨 렸습니다. 그것을하는 더 간단한 방법이있는 것처럼 보인다 .. (그러나 펄은 나에게 "단순하지 않다"(아직) ...
Peter.O

0

적어도 2 개의 찾기 명령을 중첩 할 수있었습니다.

find ~ -maxdepth 1 -type d -name '.*' -execdir \
    find {} -maxdepth 1 -type f -name '*.ini' \;

그러나 나는 거기에서 다른 -exec (dir)-호출을 호출하는 것을 해결하지 못했습니다.


그렇습니다, 그것은 바로 제 문제입니다 :)
Peter.O

네,하지만 :) 2. 중첩되지로하지 3 동일합니다 중첩되지
사용자 알 수없는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.