많은 질문을 살펴봤지만 어떤 해결책도 나에게 도움이 되지 않았습니다. cd [디렉토리]에 지정된 모든 하위 디렉터리의 모든 파일에 대해 md5sum 검사를 실행하고 싶습니다. 예:
cd [directory]
for f in *; do
if [[ -f "$f" ]]; then
(md5sum -- "$f" > "md5_${f}")
fi
done
댓글 작성자 덕분에 명령을 실행하는 대신 디렉터리로 제공하는 초기 오류를 이해했습니다.
이제 문제는 찾고 있는 첫 번째 디렉터리에서는 성공적으로 실행되지만 하위 디렉터리에서는 올바르게 실행되지 않는다는 것입니다.
댓글당
find . - type f ! - name /'md5_*' -execdir sh -c /
for f; do
b="$(basename "$f")";
[ ! -e "md5_$b" ] && md5sum "$b" > "md5$b"
done
출력 찾기: 경로는 표현식 앞에 와야 합니다. - 사용법: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path.. ] [표현하다]
답변1
이 작업은 단일 명령으로 수행할 수 있습니다 find
.
find . -type f ! -name 'md5_*' -execdir sh -c \
'for f; do
b="$(basename "$f")"
[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" > "md5_$b"
done' sh {} +
이 ! -name 'md5_*
옵션은 md5_* 파일을 제외하며, 이 -execdir
옵션을 사용하면 find는 파일이 포함된 각 디렉터리를 cd한 다음 sh -c '....'
해당 디렉터리에서 명령을 실행합니다. 각 디렉터리에서 가능한 적은 수의 명령을 실행 합니다 sh -c ...
(시스템의 최대 명령줄 제한에 따라 일반적으로 하나만 실행됩니다. 현재 일반적으로 2MB 이상).
[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ]
쉘 스크립트의 테스트는 md5sum
파일이 존재하지 않거나 자체 파일보다 최신인 파일에서만 실행되는지 확인합니다.md5_
md5_
디렉터리당 하나의 파일만 원하는 경우 md5sums.txt
훨씬 더 간단합니다.
find . -type f ! -name 'md5sums.txt' -execdir sh -c \
'md5sum "$@" >md5sums.txt' sh {} +
md5sums.txt
모든 하위 디렉터리의 모든 파일을 나열하는 파일을 원한다면 더 간단합니다.
rm -f md5sums.txt
find . -type f -exec md5sum {} + >> md5sums.txt
이 버전은 busybox 버전 find
및 기타 미니멀리스트 버전과 함께 사용해야 합니다.
find . -type f ! -name 'md5_*' -exec sh -c \
'for f; do
cd "$(dirname "$f")"
b="$(basename "$f")"
[ ! -e "md5_$b" ] || [ "$b" -nt "md5_$b" ] && md5sum "$b" > "md5_$b"
cd - >/dev/null
done' sh {} +
쉘 스크립트에서 디렉토리를 변경해야 하기 때문에 조금 더 느리게 실행됩니다... 그리고 cd
각 디렉토리에 대해 한 번만 수행하는 대신 각 파일에 대해 두 번 수행해야 합니다.
나는 디렉토리를 변경하기 위해 pushd
및 를 사용하겠지만, busybox find 또는 유사한 프로그램을 popd
실행하고 있다면 아마도 .sh
dash
답변2
이것은 a의 모든 파일을 찾아 /dir
실행합니다.md5sum /dir/file
find /path/to/directory -type f -print0 | xargs -0I{} md5sum {}
답변3
이것은 직업처럼 보입니다 find
.
find /directory -type f -exec sh -c 'a={}; md5sum -- $a > $a.md5' \;