체크섬을 기반으로 중복 파일을 찾고 삭제하기 위해이 게시물을 참조 하여 복사 작업을 수행 한 다음 대상 파일에 대한 파일 무결성 검사를 수행하는 방법을 수정하고 싶습니다.
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
fdupes
fdupes
중복 파일을 나열하도록 설계 한 프로그램 입니다. 기본적으로 md5sum을 확인합니다.
--delete
중복 항목 중 하나를 삭제 하는 옵션이 있습니다.수동으로해야하는 경우 이와 같은 것으로 시작합니다. 나는 이것을 시험하지 않았고, 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] 삭제
몇 마디 만하겠습니다