폴더에서 동일한 파일 삭제

폴더에서 동일한 파일 삭제

나는 내 운영 체제용 패키지를 빌드하기 위해 chroot를 사용하고 있습니다. 아카이브에 chroot가 있고 빌드 프로세스가 시작될 때 두 번 다운로드하고 추출합니다.두 번째 chroot 폴더의 파일과 동일한(예: 해시로) 빌드 패키지의 chroot 폴더에서 파일을 제거하는 명령이 필요합니다.Unix StackExchange에서 여러 명령을 시도했지만 그 중 아무 것도 작동하지 않았습니다.

편집: 완전 자동이어야 합니다.

답변1

그리고 fdupes:

fdupes -drN dir1 dir2

이렇게 하면 두 디렉터리에서 여러 번 발견된 항목이 모두 삭제됩니다. 사기가 처음 발견된 경우 사본이 보관됩니다.

긴 옵션이 있습니다:

fdupes --delete --recurse --noprompt dir1 dir2

이렇게 하면 dir1동일한 디렉터리에 있는 다른 파일과 중복된 파일도 제거됩니다.

GNU 도구가 있는 시스템에서 dir1스크립트를 직접 작성하면 중복 항목을 제거하여 이 문제를 해결할 수 있습니다.

#!/bin/sh

dir1=somedir
dir2=someotherdir

sums1=$(mktemp)
sums2=$(mktemp)

# Remove temporary files when done.
trap 'rm -f "$sums1" "$sums2"' EXIT

# Calculate checksums for first directory, extract only the checksums
# themselves and sort them (removing duplicate checksums).
find "$dir1" -type f -exec md5sum -z {} + |
cut -z -c -32 |
sort -z -u -o "$sums1"

# Calculate the checksums for the second directory, and sort them.
find "$dir2" -type f -exec md5sum -z {} + |
sort -z -o "$sums2"

# Join the files on the first column, extract the pathnames for the
# files in the second directory that have the same checksum as files in
# the first directory, and delete these files.
join -z "$sums1" "$sums2" |
cut -z -c 34- |
xargs -0 rm -f


# Optionally, delete empty directories in the second directory
# find "$dir2" -type d -empty -delete

위의 코드는 또한 경로 이름을 null로 끝나는 목록으로 전달하여 유효한 파일 이름이 올바르게 처리되도록 시도합니다.


bash위 스크립트의 짧은 변형:

#!/bin/bash

dir1=somedir
dir2=someotherdir

join -z \
    <(find "$dir1" -type f -exec md5sum -z {} + | cut -z -c -32 | sort -z -u)  \
    <(find "$dir2" -type f -exec md5sum -z {} + | sort -z) |
cut -z -c 34- |
xargs -0 rm -f

답변2

모든 파일의 해시를 비교하는 방법은 다음과 같습니다.

방법 1(권장):

감사해요선행은 이루기가 어렵다작업을 단순화하기 위해 사용하는 것이 좋습니다 join. 다음 명령을 사용할 수 있습니다. 파일 이름에 공백이 포함되어 있으면 작동하지 않습니다.

# DIR1 is the main directory
# DIR2 is from where files will get deleted. Change the values accordingly
DIR1="$PWD"
DIR2="$HOME"

find $DIR1 -type f | xargs md5sum 2>/dev/null | sort > /tmp/m1
find $DIR2 -type f | xargs md5sum 2>/dev/null | sort > /tmp/m2

join /tmp/m1 /tmp/m2 > /tmp/m3
cat /tmp/m3 | cut -d ' ' -f3 | xargs rm -f

# To delete empty directories
find $DIR2 -type d -empty -delete

방법 2:

여기서는 두 디렉터리에 있는 모든 파일의 해시 값을 반복적으로 계산하고 파일이 동일하면 삭제합니다.

# DIR1 is the main directory
# DIR2 is from where files will get deleted.
DIR1="$PWD"
DIR2="$HOME"

# Take a file from $DIR1 and check for it in $DIR2
for i in $DIR1/*; do
    HASH=$(md5sum $i 2>/dev/null | cut -d ' ' -f1 )
    if [ "$HASH" ]; then
        for j in $DIR2/*; do
            HASH2=$(md5sum $j | cut -d ' ' -f1)
            if [ "$HASH" = "$HASH2" ]; then
                # Delete files from $DIR2
                rm "$j"
            fi
        done
    fi
done

관련 정보