소스 파일을 삭제하기 전에 md5 합계 비교를 사용하여 파일을 이동하는 스크립트 / rsync 명령 도움말 /

거추장스러운 84

체크섬을 기반으로 중복 파일을 찾고 삭제하기 위해이 게시물을 참조 하여 복사 작업을 수행 한 다음 대상 파일에 대한 파일 무결성 검사를 수행하는 방법을 수정하고 싶습니다.

SOURCE = /path/to/Source
DEST = /path/to/Destination
# filecksums containing the md5 of the copied files
declare -A filecksums

for file in "$@"
do
    [[ -f "$file" ]] || continue

    # Generate the checksum
    cksum=$(cksum <"$file" | tr ' ' _)

    # Can an exact duplicate be found in the destination directory?
    if [[ -n "${filecksums[$cksum]}" ]] && [[ "${filecksums[$cksum]}" != "$file" ]]
    then
        rm -f "$file"
    else
        echo " '$file' is not in '$DEST'" >&2
    fi
done

rm -f체크섬이 동일한 경우에만 소스 파일 을 허용하기 위해 md5 체크섬 비교 결과를 사용하고 싶습니다 . 차이가 있으면 결과를 에코하고 탈출하고 싶습니다. rsync다른 옵션이 될 수 있지만 로컬 로컬 파일 전송에 대한 체크섬 비교를 강제하는 데 문제가 있다고 생각합니다.

업데이트 @Lucas의 대답에 따라 rsync를 사용하는 것을 조사했습니다. 대량이 아닌 확인으로 파일을보다 안정적으로 전송 mv /data1/* /data2/하고 수행 한 작업을보고하고 확인 후 삭제하는 옵션이있는 것으로 보입니다 . 이로 인해 커뮤니티 구성원이 지정한대로 정의가 좁아 질 수 있습니다.

루카스

이와 같은 것을 구현하는 것은 파일에 관심이 있고 엉망으로 만들고 싶지 않은 경우 첫 번째 시도로 어려울 수 있습니다. 따라서 bash에서 전체 스크립트를 작성하는 몇 가지 대안이 있습니다. 이는 상황에 도움이 될 수있는 다소 복잡한 명령 줄 (oneliners)입니다.

귀하의 질문에 하나의 불확실성이있다 : 당신은 비교하려는 않는 과 소스 파일을 모든 에서 파일의 최종 도착 또는 전용 "일치"파일 이름을 가진 사람? (즉 비교 될 수 /path/to/src/a/path/to/dest/a/path/to/src/b함께 /path/to/dest/b하지만 /path/to/src/a함께 /path/to/dest/b등등과)

경로가 일치하는 파일 만 비교하고 싶다고 가정하겠습니다 !!

첫 번째 아이디어 : diff

좋은 노인 diff은 디렉토리를 재귀 적으로 비교할 수 있습니다. 또한 -q옵션을 사용하여 파일이 어떻게 다른지 확인하는 것이 아니라 차이점을 확인하십시오 .

diff -r -q /path/to/source /path/to/dest

단점

  • 하드 디스크의 크기에 따라 시간 오래 걸릴 수 있습니다 .
  • 이것은 이전 파일을 삭제하지 않습니다.
  • 쉽게 파싱 할 수없는 출력

찬성

  • 이것은 파일을 삭제하지 않습니다. :)

따라서 관심있는 파일에 차이가 없음을 수동 / 시각적으로 확인한 후에는 rm -rf /path/to/source.

두 번째 아이디어 : rsync(편집 : 이것이 지금 최고 일 수 있음)

rsync모든 복사 명령 줄 도구의 마스터입니다 (내 의견으로는;). 귀하의 질문에 대한 의견에서 언급했듯이 --checksum옵션이 있지만 다른 옵션도 많이 있습니다. 파일을 로컬에서 원격으로 원격에서 로컬로, 로컬에서 로컬로 전송할 수 있습니다. 제 생각에 가장 중요한 기능 중 하나는 올바른 옵션을 제공하면 명령을 중단하고 다시 시작할 수 있으며 (동일한 명령 줄을 다시 실행) 남은 곳에서 계속됩니다!

귀하의 목적을 위해 다음 옵션이 흥미로울 수 있습니다.

  • -v: verbose, 무슨 일이 일어나는지 보여 주면 여러 번 주어질 수 있지만 일반적으로 하나이면 충분
  • -n: 드라 이런, 테스트에 매우 중요하지만 아무것도하지 마십시오 (와 결합 -v) !!
  • -c: 체크섬을 사용하여 복사 할 내용 결정
  • --remove-source-files: 성공적으로 전송 된 파일을 제거합니다 (@ brawny84에 의해 지적, 몰랐고 처음 읽었을 때 맨 페이지에서 찾지 못했습니다).

따라서이 명령은 (이름으로 대응하는) dest해당 파일과 다른 체크섬을 가진 모든 파일을 덮어 씁니다 source.

 rsync -a -c -v --remove-source-files -n /path/to/source /path/to/dest
 rsync -a -c -v --remove-source-files    /path/to/source /path/to/dest

찬성

  • 체크섬과 함께 작동
  • 드라 이런 모드가 있습니다
  • 실제로 소스마다 다른 모든 누락 된 파일과 파일을 복사합니다.
  • 중단 및 재시작 가능
  • 모든 파일을 복사하지 않으려면 src의 일부 파일을 무시하는 제외 옵션이 있습니다.
  • 전송 된 소스 파일을 삭제할 수 있습니다.

단점

  • ??

세 번째 아이디어 : fdupes

fdupes중복 파일을 나열하도록 설계 한 프로그램 입니다. 기본적으로 md5sum을 확인합니다.

찬성

  • md5를 사용하여 파일을 비교합니다.
  • --delete중복 항목 중 하나를 삭제 하는 옵션이 있습니다.

단점

  • 파일을 다른 모든 파일 과 비교 하므로 dest 자체 내에 중복 파일이 있으면 해당 파일도 나열됩니다.
  • 삭제 모드는 상호 작용하는 것처럼 보이므로 동일한 파일의 모든 세트에 대해 확인해야합니다. 이는 대형 디렉토리 트리에서는 가능하지 않을 수 있습니다.
  • 비대화 형 모드는 동일한 파일의 각 세트에서 첫 번째 파일을 제외한 모든 파일을 삭제합니다. 그러나 첫 번째 파일이 (소스 또는 대상에서?) 어떤 것인지 모릅니다.

마지막 아이디어 : 자신의 쉘 스크립트를 실제로 작성하고 디버깅하는 고통을 겪으십시오.

수동으로해야하는 경우 이와 같은 것으로 시작합니다. 나는 이것을 시험하지 않았고, ls처음으로 그것을 시도하고 그것이 무언가를 제동시킬 것인지 알아 내려고 노력하십시오!

#!/bin/bash
# first require that the source and dest dirs
# are given as arguments to the script.
src=${1:?Please give the source dir as first argument}
dest=${2:?Please give the destination dir as second argument}
# go to the source directory
cd "$src"
# This assumes that there are no newlines in filenames!
# first find all plain files in the current dir 
# (which should be $src)
# then use xargs to hand the filenames to md5sum 
# pipe the md5 sums into a subshell
# go to the dest in the subshell
# read the md5sums from stdin and use md5sum -c to check them 
# After the subshell filter lines to only keep those that end in "OK"
# and at the same time remove the "OK" stuff after the file name
# use xargs to hand these file names to ls or rm.
find . -type f | \
  xargs md5sum | \
  ( cd "$dest" && md5sum -c ) | \
  sed -n 's/: OK$//p' | \
  xargs ls

ls마지막 줄에 체크를 통과하여 모든 파일을 나열하는 것입니다. 이를로 rm바꾸면 소스 디렉토리 (이후의 현재 디렉토리)에서 제거됩니다 cd "$src".

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관