다른 "find -exec" 안에 "find -exec"를 중첩할 수 있나요?

다른 "find -exec" 안에 "find -exec"를 중첩할 수 있나요?

다음과 같은 것이 내가 추구하는 것입니다. 그러나 어떻게 탈출하든 내 코드는 작동하지 않습니다 {}.+ ;

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

이것을 본 후Unix 및 Linux 문제, 다음 코드는 작동하지만 중첩되지 않았습니다.찾다그래서 저는 이 특정 작업을 수행하는 더 좋은 방법이 있다고 생각합니다.

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위에서 언급한 것처럼 쉘과 이상한 인용 및 이스케이프 제약 조건을 호출하지 않고 중첩할 수 있는 방법이 있습니까 ?

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

답변1

다음과 같은 단일 찾기를 사용해 보겠습니다.

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.]

답변2

원래 질문에는 찾기 위해 재귀 호출이 필요하지 않지만 그게 요점이라고 생각하지 않습니다.

나는 당신이 원하는 방식으로 find를 재귀적으로 호출하는 것이 불가능하다고 믿습니다.

다음은 둘 중 하나(또는 중첩된 이름)를 찾기 위한 재귀 호출이 아니지만 첫 번째 찾기의 결과 집합을 가져와서 두 번째 찾기에 공급할 수는 없나요? 본능적으로 나는 이렇게 할 것이다:

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

xargs를 사용하여 두 번째 조회를 수행 할 수도 있습니다 .

고쳐 쓰다:

대부분의 UNIX 유틸리티는 하나가 아닌 여러 개의 파일 이름 인수를 사용하므로 일반적으로 완전히 피할 수 있다는 점을 덧붙이고 싶습니다 -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

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

분명히 초기 예는 다음과 같이 할 수 있으므로 좋은 예가 아닙니다.

md5sum .*/*.ini

답변3

적어도 나는 2개의 find 명령을 중첩할 수 있었습니다.

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

하지만 거기에서 또 다른 -exec(dir)-call을 호출하는 문제는 해결하지 못했습니다.

관련 정보