폴더와 폴더 구조 비교

폴더와 폴더 구조 비교

사진과 필름이 담긴 카메라의 SD 카드가 있습니다. 내 메인 박스에는 다음과 같은 디렉터리 이름을 가진 폴더 구조가 있습니다: Images/YYYY-MM-description 및 때로는 아래에 다른 이름을 가진 하위 폴더가 있습니다. SD 카드에 있는 파일 이름은 폴더에 있는 파일 이름과 동일합니다.

내 상자에 SD 카드의 모든 파일이 포함되어 있는지 확인하기 위해 SD 카드를 폴더 구조와 비교(체크섬)하고 싶습니다. MD5ing에 대해 생각했지만 사용 사례에 맞는 알고리즘이면 충분합니다.

rsyncor를 사용하려고 생각했지만 diff상자에 여러 레이어가 있으므로 해결책을 찾을 수 없습니다.

만약을 대비해 시스템은 데비안입니다.

답변1

md5deep을 사용할 수 있습니다.

sudo apt-get install md5deep

먼저 결과를 폴더에 저장합니다.

md5deep -r -s /dir1> dir1sums

이제 다른 폴더와 비교해 보세요.

md5deep -r -X dir1sums /dir2

출력이 없으면 디렉터리가 동일하다는 의미입니다. 그렇지 않으면 다른 파일에 대한 해시가 표시됩니다.

답변2

나는 다음과 같은 가정을 할 것이다:

1) 모든 파일 이름은 고유합니다.

2) 누락된 파일만 확인하려는 경우(각 장치의 파일에 동일한 md5 합계가 있는 경우, 즉 사진이 손상된 경우)

3) 파일은 이 시스템에서만 누락될 수 있습니다. SD 카드에는 기본적으로 모든 파일이 있습니다.

가정 1 외에도 스크립트를 변경하여 두 위치 중 하나에서 단일 파일을 찾거나 각 파일 쌍에 대해 md5 교차 검사를 수행할 수도 있습니다.

이런 식으로 모든 파일 이름을 선택하고 다음을 사용하여 ue 파일 이름 find목록을 확인할 수 있습니다.uniq

#!/bin/bash

#load all file names from local dir as array:
pics_local=( $( find /path/to/dir/ -type f -printf "%f\n" ) )
#load all file names from SD card as array:
pics_SD=( $( find /mnt/SD/ -type f -printf "%f\n" ) )
#see if files are only in one of them,
#i.e. if file names appear only once (save as array):
singulars=( $( printf "%s\n" ${pics_local[@]} ${pics_SD[@]} |\
            sort | uniq -u ) )
#print list of missing files with full paths using find:
for (( i=0 ; i<=${#singulars[@]}-1 ; i++ )) ; do
    find /mnt/SD/ -type f -name "${singulars[$i]}"
done

업데이트: 파일당 md5sum을 사용하는 스크립트: SD에 모든 파일이 있고 로컬 디렉터리에서 누락된 파일을 검색합니다. 모든 로컬 파일은 SD 파일과 동일합니다(md5 및 일치하지 않는 해당 파일 제외).

#!/bin/bash

#load file names and md5sums of files on SD card into array
files_SD=( $( find /mnt/SD/ -type f ) )
md5_SD=( $( find /mnt/SD/ -type f -exec md5sum {} + | cut -d' ' -f1 ) )
#load md5sums of files in local folder into array:
md5_loc=( $( find /local/dir/ -type f -exec md5sum {} + | cut -d' ' -f1 ) )

#check for the very unlikely possibility of md5sums
#matching for more than two files
#IMHO: can be safely skipped
if [[ $(sort <( printf '%s\n' ${md5_loc[@]} ${md5_SD[@]}) |\
      uniq -c | awk ' $1 >= 3 ' ) ]] ; then
  echo "md5 sums matching for more than 2 files!"
  echo "critical error, aborting"
  exit
fi

singular_md5s=( $( printf '%s\n' ${md5_loc[@]} ${md5_SD[@]} | sort | uniq -u ) )
for (( i=0 ; i<=${#singular_md5[@]}-1 ; i++ )) ; do
  #assume SD card has all files
  #print file that is missing in local folder:
  #1) find where it is in the array:
  n=$(( $(grep -n "${singular_md5s[$i]}" <( printf '%s\n' ${md5_SD[@]} ) | cut -d: -f1 )-1 ))
  #2) print file name
  echo "${files_SD[$n]} missing on local folder"
done

관련 정보