find: 디렉터리를 처리하고 결과를 찾은 디렉터리에 씁니다.

find: 디렉터리를 처리하고 결과를 찾은 디렉터리에 씁니다.

디렉토리를 찾고 여기에 명령을 적용하면 결과가 발견된 디렉토리로 파이프되어야 합니다.

find -type d주어진 것으로 가정

.
./cortexa53-crypto-mx8mp
./cortexa53-crypto
./imx8mp_sp
./all

나는 다음과 같은 일을 고려했습니다.

find -type d -exec '~/bin/opkg-utils/opkg-make-index {} | gzip > {}/package.gz'  \;

결과는 다음과 같습니다.

find: '~/bin/opkg-utils/opkg-make-index ./cortexa53-crypto-mx8mp | gzip > ./cortexa53-crypto-mx8mp/package.gz': No such file or directory

하지만 해당 명령을 실행하면(내부에 무엇이 있는지 ' ') 작동합니다! ? ! ?

보너스 질문: 그것을 찾는 것을 피하는 방법은 무엇입니까 .?

답변1

의 매개변수를 사용하여 간단한 명령보다 더 복잡한 명령을 실행해야 하는 경우 -exec인라인 스크립트에서 다음을 수행하십시오.

find . -type d -exec sh -c '
    tmpfile=$(mktemp) || exit
    trap "rm -f \"\$tmpfile\"" EXIT

    for dirpath do
        "$HOME"/bin/opkg-utils/opkg-make-index "$dirpath" | gzip -c >"$tmpfile" &&
        cp -- "$tmpfile" "$dirpath"/package.gz
    done' sh {} +

그러면 대량 디렉터리 경로가 인라인 sh -c스크립트에 매개변수로 전달됩니다. 이 짧은 스크립트는 이러한 경로를 반복하고 각 경로에 대해 유틸리티를 호출하고 압축된 출력을 임시 파일에 씁니다. 파일이 기록되면 디렉터리로 이동되고 루프는 다음 디렉터리로 계속됩니다.

이는 하위 디렉터리로 반복됩니다.

.검색 사용을 피하려면 다음을 수행하십시오 ! -path ..

find . ! -path . -type d -exec sh -c '...' sh {} +

또는 GNU find(및 기타 일부)의 경우 다음을 사용하십시오 -mindepth 1.

find . -mindepth 1 -type d -exec sh -c '...' sh {} +

하위 디렉터리로 반복되는 것을 방지하려면 -prune디렉터리를 찾는 즉시 다음을 사용하세요.

find . ! -path . -type d -prune -exec sh -c '...' sh {} +

또는 GNU의 경우 다음을 find사용합니다 -maxdepth 1.

find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '...' sh {} +

그러나 재귀를 사용하지 않고 단일 디렉토리에만 관심이 있는 경우 쉘 루프를 사용할 수 있습니다.

shopt -s nullglob dotglob

tmpfile=$(mktemp) || exit
trap 'rm -f "$tmpfile"' EXIT

for dirpath in */; do
    dirpath=${dirpath%/}
    [ -h "$dirpath" ] && continue

    "$HOME"/bin/opkg-utils/opkg-make-index "$dirpath" | gzip -c >"$tmpfile" &&
    cp -- "$tmpfile" "$dirpath"/package.gz
done

이는 실행된 인라인 스크립트의 루프와 기본적으로 동일 find하지만 스크립트이므로 의도한 작업 bash중 일부를 수행해야 합니다 (와일드카드 숨겨진 이름 활성화, 심볼릭 링크가 아닌지 확인 등). . )find$dirpath

관련 정보