両方のフォルダに3つのファイルがあります。ファイル名が指定され、a.txt
フォルダにb.txt
配置されます。アプリを使用しました。c.txt
A
B
フルファイルミニコンパレータフォルダを比較し、そのA
フォルダにログを保存します。
ログには次のテキストがあります。
Different: A=/sdcard/A/a.txt B=/sdcard/B/a.txt
Same: A=/sdcard/A/b.txt B=/sdcard/B/b.txt
Different: A=/sdcard/A/c.txt B=/sdcard/B/c.txt
sed
およびrm
/または他のコマンドを使用して「同じ」ファイルを永久に削除/削除するにはどうすればよいですか?
答え1
あなたは
$ tree
.
|-- A
| |-- a.txt
| |-- b.txt
| `-- c.txt
`-- B
|-- a.txt
|-- b.txt
`-- c.txt
2 directories, 6 files
使用fdupes
:
$ fdupes -1 A B
A/b.txt B/b.txt
fdupes
ファイルの内容に基づいて重複を検出します。この-1
フラグを使用すると、各冗長セットのファイル名が1行に出力されます。ここでは、b.txt
ファイルが同じものとして検出されます。
以下を使用して重複項目を削除できますfdupes
。
$ fdupes --delete A B
[1] A/b.txt
[2] B/b.txt
Set 1 of 1, preserve files [1 - 2, all]: 1
[+] A/b.txt
[-] B/b.txt
どちらのファイル(または両方のファイル)を保持するかを対話的に尋ねます。1
削除A/b.txt
してもファイルが保持されるように作成しました。B/b.txt
fdupes
()マニュアルを参照してくださいman fdupes
。システムにインストールされていない場合は、パッケージマネージャを使用してインストールします。インタラクティブなプロンプトなしでファイルを自動的に削除するようにすることもできますが、実行時には注意が必要です。ファイルを削除できるコマンドを実行する前に、必ずデータをバックアップしてください。
少なくとも1つのfdupes
レプリカは常に維持されます。すべての重複エントリを削除するには、fdupes
同様の質問に対するSuperUserの回答に記載されているこのパッチバージョンに興味があるかもしれません。https://superuser.com/a/947770/96962(私はこれをテストしていません)。
ログファイルを解析するよりも使用を推奨するのは、fdupes
テキスト文書に含まれるファイル名が正しく解析するのが難しいからです。おそらくそうではありません。いつも難しいかもしれませんが(この特定の例では簡単です)、Unixではファイル名とディレクトリ名にスペースと改行を許可することに注意してください。これは技術的にというファイルがある可能性があります。
a.txt
Same: A=
名前に改行が含まれています。
答え2
そしてawk
:
awk -F'[:]' '/Same:/{print $0}' logfile | xargs -n1 | awk -F'=' '{print $2}' | xargs rm -rf
awk
ログファイルでキーワード「Same:」を含む行を見つけ、変数とパスxargs
(A = ***など)を各行と照合し、awk
絶対パスをキャプチャします。最後のステップでは、パスを削除するようにxargs
求められます。rm
xargs
パスを削除するように求められたら、rm
ファイルが確実に削除されることに注意することが重要です。ユーザーに削除確認を思い出させる-I
ためにフラグを追加できます。rm
- 3つ以上のファイルを削除する前または再帰的に削除するときに一度メッセージを表示し、ほとんどのエラーに対する保護を提供しながら、-iよりも邪魔になりません。
またはgrep
grep "Same:" logfile | grep -oP '/[^ ]*' | xargs rm -rf
最初はgrep
キーワードを含む行を探しますSame
。
2番目はgrep
ログファイルを埋め、キーワードに関連付けられたパスを除くすべてを削除します。最後にルートの削除をxargs
要求します。rm
答え3
同じファイルをすべて削除しますか、それともn-1個のファイルのみを削除してコピーを維持しますか?まあ、なぜできないのですか?
awk '/Same:/ {for (i=2; i<=NF; i++) {split ($i, T, "="); print "rm", T[2]}}' log
rm /sdcard/A/b.txt
rm /sdcard/B/b.txt
sh
結果が満足であれば入力してください。コピーも保存するには、最初から循環してくださいi=3
。
または、以下のない別のアプローチawk
:
echo rm $(md5sum path/to/files* | sort | uniq -Dw33 | cut -d" " -f3-)
rm file2 file4
echo
結果が満足であれば削除してください。ファイル名にスペースが含まれている場合は、追加の手順が必要です。