バックアップに問題があり、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
指定された最初のディレクトリを優先する短いスクリプトを以下に示します。ファイルを直接削除するのではなく、削除するリストを印刷するだけです。次の規則に従います。
- ファイルを印刷しない
dir1
に含まれていないファイルは
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
ファイルに保存し、ファイルを実行可能として設定し、実行してみます。