fdupes -rdNより重複を排除するより詳細な方法はありますか?

fdupes -rdNより重複を排除するより詳細な方法はありますか?

最近重複したアイテムをたくさん削除する必要があります。 3~4個のファイルシステムをマージしてスペースを経済的に使いたいです。最初はfdupes作業に最適なツールのように見えましたが、ますます限界にぶつかっています。

順序を考慮してくださいfdupes -rdN somedirectory/。これにより、ディレクトリのサブディレクトリにあるすべてのファイルのハッシュが生成されます。

重複したアイテムが見つかった場合は、すべてのアイテムのコピーが1つだけ削除されます。

しかし、somedirectory/subdirectory1/somefile維持したいのですが、実際に4つの重複項目があり、プログラムが重複項目の1つを最初に発見した場合はどうなりますか?次に、somedirectory/subdirectory1/somefile私が望んでいないアイテムを削除します。

どのような重複項目を保持するかどうかを指定できたらと思います。これまで、冗長処理のための標準プログラム(duff、FSLint)のどれもこの動作を自動化することを許可していないようです。私が直接したくないので、このような質問をします。

次のような文章を書けたらいいな

killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/

答え1

探している機能が在庫がない間fdupesフォークしました。fdupes (私のフォーク名はjdupesそして、場合によっては、この問題を解決するためのいくつかの機能を追加しました。たとえば、somedirectory/subdirectory1/somefile重複するアイテムを自動的に削除するときに保持(および一緒に切り替え)dし、N下に別のファイルがない場合は、各直接サブディレクトリPath-に最初と切り替えsomedirectory(コマンドによるファイルの並べ替え)を提供しますできます。jdupes行パラメータの順序が優先されます):subdirectory1-O

jdupes -rdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3

これにより、重複セットから1つのファイルを除くすべてのファイルが自動的に削除され、ファイルがセットに含まれている場合、そのファイルが最初のファイルになり、自動的にセットに保持されるsomedirectory/subdirectory1ファイルになります。このアプローチには、維持somedirectory/subdirectory1したいものとは異なるレプリカを維持する可能性などの明白な制限がありますが、あなたのような多くの場合、jdupes引数順序オプションは解決策で十分です。

近日中にファイルの包含/除外、ジョブの保存、およびこれらの「フィルタスタック」の適用を全体的または個別に制御できるフィルタリングシステムを追加する予定です。パラメータ基準jdupes-Nこの機能は非常に必要です。私は「ゼロ以外の重複項目を自動的に再帰的に削除しますが、常にそのままにする」のようなsomedirectory/subdirectory1/somefile機能を想像します。

jdupes -rdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/

アップデート(2022-03-01):-X2020年に追加された拡張フィルタオプションを見てください。これは正確には必要ではありませんが、nostrフィルタonlystrを使用すると、無視または必要とするフルパスのサブストリングを指定できます。

答え2

私はこれを他の場所では見たことがありません。あなたが望むものはこれだと言ってください。 /mnt/folder-tree-1 /mnt/folder-tree-2 があります。重複したファイルをすべて削除したくありませんが、ツリー2にファイルがあり、ツリー1にも同じファイルが同じパスと名前で存在する場合は、ツリー2から削除してください。

警告:これは非常に簡潔なので、制限されたシェル技術でこれをコピーして貼り付けようとする場合は注意してください。

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt

fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line
do
if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt
then
    echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2//|')\"
fi
done > rm-v2-dupes.sh

または、1行にすべて記入してください。

fdupes -rn /mnt/folder-tree-1/ /mnt/folder-tree-2/ > dupes-all.txt; fgrep /mnt/folder-tree-1/ dupes-all.txt | while read line; do if grep -q "`echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|'`" dupes-all.txt; then echo rm \"$(echo $line | sed -e 's|^/mnt/folder-tree-1/|/mnt/folder-tree-2/|')\"; fi; done > rm-v2-dupes.sh

次に、rm-v2-dupes.sh を確認して実行します。

答え3

重複ファイルを一緒にハードリンクするのはどうですか?これは空白を一度だけ使用しますが、まだすべてのパスに存在します。問題は、ハードリンクファイルをその場で変更する必要があることです(削除されたファイルのみを変更して新しいコンテンツで再作成できます)。代替案は、ファイルを一緒にシンボリックリンクすることです。しかし、どの「基本」ファイルを決定するのにも同じ問題があります。これは次のスクリプトを使用して実行できます(ただし、スペースを含むファイル名は処理しません)。

fdupes --quiet --recurse --sameline somedirectory/ | while read SOURCE DESTS; do
    for DEST in $DESTS; do
        ln -f $SOURCE $DEST
    done
done

答え4

前の回答にツイストを追加するだけです。| grep削除したいフォルダを簡単に分離するために、以前の回答を少し変更して、次のコードを複数回使用しました。

`fdupes -r -n -S /directory | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

今回も、コメント行なしでリストされているすべてのファイルを削除するshファイルが作成されます。もちろん、ファイルを編集して、保持したい特定の行/ファイルをコメントアウトすることもできます。

大規模なディレクトリのもう一つのヒントは、txtファイルでfdupesを実行し、目的の結果が得られる| grepまで実験することです。| sed

`fdupes -r -n -S /directory > duplicate-files.txt`
`cat duplicate-files.txt | grep /delete-from-directory | sed -r "s/^/rm \"/" | sed -r "s/$/\"/" >remove-duplicate-files.sh`

関連情報