모든 하위 디렉터리의 모든 파일에 대해 검사 실행

모든 하위 디렉터리의 모든 파일에 대해 검사 실행

많은 질문을 살펴봤지만 어떤 해결책도 나에게 도움이 되지 않았습니다. 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실행하고 있다면 아마도 .shdash

답변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' \;

관련 정보