fdupes にどのファイルを保持するかを伝えるにはどうすればよいでしょうか?

fdupes にどのファイルを保持するかを伝えるにはどうすればよいでしょうか?

バックアップに問題があり、HD に多数のフォルダーが複数あります。メインの「フォルダー ツリー」が 1 つあり、これをそのままにしておきたいと考えています。削除したくないディレクトリ内のファイルを fdupes が削除しないようにするにはどうすればよいでしょうか。

重複を見つける別のユーティリティはあるでしょうか?

答え1

重複を見つける別のユーティリティはあるでしょうか?

使用リント、--keep-all-tagged オプションを使用すると、まさに必要なことが実行されます。

$ rmlint --types=duplicates --keep-all-tagged /path/to/dupes /other/path/to/dupes // main/folder/tree

答え2

プロセスを遅くして、少し注意してみてはいかがでしょうか

重複の比較を取得しfdupesてファイルに保存します。

fdupes -r /path/to/start > filesToDelete

その後、自分のペースで、残しておきたいディレクトリやファイルをfilesToDelete

ディレクトリ全体を削除するには

sed -i '|/directoryToKeep/|d' filesToDelete 

お好みのテキストエディタで作業しfilesToDelete、コピーしたい各ファイルの先頭にマーカー(xなど)を付けます。保つそうすれば、自分が何をしたかを追跡することができ、変更が確実になったら

cat aFile | xargs -d "\n" rm

rmは、x の付いた各行 (および によって生成されたコメントやその他の行fdupes) でエラーをスローしますが、それらのファイルに対しては何も行いません。ただし、 内のマークされていない有効なファイル名エントリはすべて削除されますfilesToDelete

答え3

指定された最初のディレクトリを優先する短いスクリプトを以下に示します。ファイルを直接削除するのではなく、削除するリストを印刷するだけです。次の規則に従います。

  1. ファイルを印刷しないdir1
  2. に含まれていないファイルはdir1印刷しないでください。

    #!/usr/bin/env bash
    # priority_dup.sh dir1 dir2 [dir3 ...]`
    
    set1=() # List collects all matching files for a set.
    IFS=$'\n'
    fdupes -r "$@" | while read i; do
        if [[ "$i" == "" ]]; then
            # Create new set, minus all files from dir1.
            set2="$(echo "${set1[*]}" | grep -v "^$1/")"
            # If the sets are different, then we can print files for deletion.
            if [[ "${set1[*]}" != "$set2" && "$set2" != "" ]]; then
                echo "$set2"
                echo ""
                set1=()
            fi
        else
            set1+=("$i")
        fi
    done
    

    ファイルに保存し、ファイルを実行可能として設定し、実行してみます。

関連情報