내 문제 (와의 스크립트에서 #!/bin/sh
)는 다음과 같습니다. 보관 목적으로 디렉토리의 모든 파일을 체크섬하려고합니다. 모든 파일 이름을 가진 체크섬 (내 경우에는 sha1) 파일은 동일한 디렉토리에 있어야합니다. ~/test
파일 f1
과 디렉토리가 있다고 가정 해 봅시다 f2
.
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
이제 체크섬을 계산하여
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
내가 원하는 것을 정확하게 수행하면 현재 디렉토리의 모든 파일 만 나열하고 sha1 합계를 계산합니다 (maxdepth는 나중에 변경 될 수 있음). STDOUT의 출력은 다음과 같습니다.
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
불행히도,이 파일을 파일에 저장하려고 할 때
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
결과 파일은 체크섬 자체를 표시합니다.
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
따라서 shasum --check
마지막 합계를 저장할 때 추가 파일 수정의 명백한 문제 때문에 나중에 실패합니다 .
나는 주변을 둘러보고 -p
for 플래그를 사용 xargs
하여 find 명령을 실행하기 전에 어떻게 든 출력 파일을 생성한다는 것을 알았습니다. 따라서 추가 파일이 발견되어 체크섬됩니다 ...
해결 방법으로 체크섬을 다른 위치 (temp 디렉토리를 통해 mktemp
)에 저장하거나 구체적으로 찾기에서 제외시킬 수는 있지만 그것이 어떻게 작동하는지 왜 이해하고 싶습니다. 예를 들어 첫 번째 명령으로 출력 파일이 이미 디스크에 있는지 확인하면 정답을 얻지 못할 것입니다 ...
sh
호출이 필요한 경우에도 작동하지 않을 수 있습니다. $0
before에 대한 인수가 필요합니다 {}
.
tee
이 사라졌습니다? 나는 그것을 시도하고 잘 작동하며,를 추가하여 STDOUT을 억제했습니다 1>/dev/null
. 답변에 문제가 있었습니까, 아니면 버그입니까?
xargs
되기 전에 쉘이 모든 입력, 출력 및 파이프를 재 지정하므로find
출력 파일이 시작될 때 이미 존재 하기 때문에이 파일을 작성하는 것은 쉘 자체 가 아닙니다 . 사용-exec
하는 대신 :find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +