フォルダから同じファイルを削除する

フォルダから同じファイルを削除する

私はオペレーティングシステム用のパッケージを構築するためにchrootを使用しています。アーカイブにchrootがあり、ビルドプロセスが開始されたときに2回ダウンロードして抽出します。2番目の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

関連情報