web-dev-qa-db-ja.com

2つのディレクトリを比較して重複ファイルを削除する方法

同じ名前、サイズ、タイプのファイルを2つのディレクトリで検索して、それらのディレクトリの1つから削除するにはどうすればよいですか?

8

私は2つのディレクトリp1とp2の例をとっています

最初に、p1およびp2ディレクトリのファイル名の出力を2つの出力ファイルに保存します

find /root/p1 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P1_file.txt

 find /root/p2 -type f |awk -F "/" '{print $NF}'   > /var/tmp/P2_file.txt

今、私は両方のディレクトリで共通のファイル名を見つけ、一方のディレクトリで削除します。/root/p1内の重複ファイルを削除し、/ root/p2内のファイルを保持してほしい

awk 'NR==FNR {a[$1];next}($1 in a) {print $1}' /var/tmp/P1_file.txt /var/tmp/P2_file.txt  |awk '{print "rm -rvf" " " "/root/p1/"$1}' | sh

テストして正常に動作した

4

fdupesの使用:

fdupes --delete dir1 dir2

fdupesは、ファイル名やファイルタイプではなく、ファイルサイズと内容(暗黙的にファイルタイプを含む)をテストします。

例:

$ mkdir dir1 dir2

$ touch dir{1,2}/{a,b,c}

$ tree
.
|-- dir1
|   |-- a
|   |-- b
|   `-- c
`-- dir2
    |-- a
    |-- b
    `-- c

2 directories, 6 files

$ fdupes --delete dir1 dir2
[1] dir1/a
[2] dir1/b
[3] dir1/c
[4] dir2/a
[5] dir2/b
[6] dir2/c

Set 1 of 1, preserve files [1 - 6, all]: 1

   [+] dir1/a
   [-] dir1/b
   [-] dir1/c
   [-] dir2/a
   [-] dir2/b
   [-] dir2/c

$ tree
.
|-- dir1
|   `-- a
`-- dir2

2 directories, 1 file
7
Kusalananda

多くのUnixに存在するdircmpを使用することをお勧めします。

見る:

man dircmp

-dオプションは、最も適切と思われるオプションのようです。

dircmp -d dir1 dir2

dir1dir2の内容を比較し、diffのような出力を表示します。

2
dan

rmlint には、これを行うオプションがあります。

rmlint -T duplicates --match-basename --keep-all-tagged --must-match-tagged /duplicates // /originals

(「//」区切り文字は、-keep-all-taggedおよびの「タグ付き」パスを識別します-must-match-taggedスイッチ)

重複を見つけた後、rmlintは実行可能なスクリプトrmlint.shを作成します。 (チェック後に)実行して重複を削除できます。

1
thomas_d_j

タスクには多くのオプションがあります。私の前で答えた人の推奨事項を繰り返すのではなく、あなたがより快適であるかもしれない別のルックアンドフィールの提案を追加します。

コンソールのncursesベースのツインパネルファイルマネージャーであるmidnight commanderを使い慣れている場合は、そのプログラムにグラフィカルディレクトリ比較機能が含まれています。

これを使用する手順は、パネルに表示されている各ディレクトリから開始し、C-x d(デフォルトのキーバインディング)またはF9 c c(メニュー項目のデフォルトのホットキー)を押します。

コマンドとその3つの操作モードを説明するmcのマニュアルページからの編集後の抜粋を次に示します。

  The "Compare directories" command compares the directory panels with
  each other. You can then use the Copy (F5) command to make the panels
  identical. There are three compare methods. The quick method compares
  only file size and file date. The thorough method makes a full
  byte-by-byte compare. The size-only compare method just compares the
  file sizes and does not check the contents or the date times, it just
  checks the file size.

比較が完了すると、mcは現在のディレクトリに固有のファイルを選択して視覚的にハイライト表示します。したがって、F5を押すと、他のパネルにコピーされます。両方のディレクトリに共通のファイルを削除するには、*を押して選択を切り替え(mcが以前ハイライトされていたものの逆をハイライトする方法に注意してください)、F8を押して削除。

1
user1404316

--deleteオプションを指定してコマンドを実行すると緊張するので、次のスクリプトを記述して、$ DIR1と$ DIR2の両方で共有されるファイルを検索しますが、ファイルを$ DIR1からゴミ箱フォルダーに移動するだけです。後で、一意のファイルを残して確認します。また、ごみ箱フォルダ内のディレクトリ構造を保持するため、削除を簡単に解除できます。

IFS=$'\n'
for file in `jdupes -r -T -T "$DIR1" "$DIR2" | awk -v p1="$DIR1" -v p2="$DIR2" '$0 ~ p1 && $0 ~ p2'  RS="\n\n" ORS="\n\n" | grep "$DIR1"`; do
    echo "$file" | grep -q "^$DIR1/duplicated_files/" && continue
    output="$DIR1/duplicated_files/`dirname "$file" | awk -v p="$DIR1/" '{sub(p, "")}1'`"
    mkdir -p "$output"
    echo "Moving $file"
    mv "$file" -t "$output"
done

これにより、空のディレクトリが残ります。空のディレクトリは次のようにして削除できます。

find "$DIR1" -type d -empty -printf "Deleting empty folder: " -print -delete
0
SurpriseDog

質問にubuntuのタグを付けたようですが、通常はグラフィカルデスクトップに付属しているので、ここにいくつかのグラフィカルデスクトップオプションを示します。

1)nautillusファイルマネージャーを使用している場合、nautilus-compareと呼ばれるubuntuパッケージが存在し、ディレクトリ比較をすでに使用しているファイルマネージャーに統合します。

2)ファイルとディレクトリの両方の比較を実行するmeldと呼ばれるスタンドアロンプ​​ログラムも存在します。

0
user1404316