나는 내 운영 체제용 패키지를 빌드하기 위해 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