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