如何递归地清除一个文件夹中另一个文件夹中存在的重复项?

如何递归地清除一个文件夹中另一个文件夹中存在的重复项?

概括:

  • 文件夹 A 只有许多优秀文件
  • 文件夹 B 包含许多混合了优秀/良好/不良文件的文件夹

我怎样才能删除文件夹 B 文件夹中的文件(前提是它们位于文件夹 A 中)。

换句话说,如何检查文件夹 B 文件夹中是否存在文件夹 A 文件,然后从文件夹 B 文件夹中删除?

解决方案 也许是一个命令:

  1. 检查字母表的一部分,例如所有以 A 开头的字母
  2. 对文件夹 B 子文件夹中找到的文件执行删除操作
  3. 重复 1. + 向上一个字母。

其他复制程序不好的原因:

  1. 第一次删除需要很长时间 - 只有扫描完成后才可以
  2. 并且无法选择在文件夹 B 中删除。只能保留最新的内容和其他内容,但不能选择保留在哪个文件夹中。

无用的历史:文件已从 Recuva 复制到文件夹 B 中,部分已整理,但其中很多文件已损坏。因此,首先,我在考虑文件夹 B 是否存在于那些已恢复的文件,但现在 Recuva 仅在文件夹 A 中恢复了 Excelent,因此大多数 Excelent 都位于文件夹 A 中。

示例文件树:

.
├── A
│   ├── 1.png
│   ├── 2.png
│   └── Excellent
│       ├── e1.png
│       └── e2.png
└── B
    ├── 1.png
    ├── 2.png
    ├── Bad
    │   ├── 1.png
    │   ├── 2.png
    │   ├── e1.png
    │   └── e2.png
    └── Excellent
        ├── e1.png
        └── e2.png

答案1

以下是两种解决方案,取决于我们如何定义“重复”:

  • 具有相同相对路径的文件,或
  • 内容相同但名称不一定相同的文件

如果我们所说的“重复”是指两个共享相同相对路径的文件,那么您可以使用findxargs删除重复项。例如,假设您有

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── bar
│   ├── baz
│   └── foo
└── Good

然后

find /home/unutbu/tmp/A  -depth -type f -print0 | xargs -0 -I{} bash -c 'rm "/home/unutbu/tmp/B${1#*A}"' - {}

结果是

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

或者,如果我们所说的“重复”是指两个文件共享相同的内容,尽管文件名可能不同,但是您可以使用rdfind

sudo apt-get install rdfind

如果我们有这样的目录结构:

~/tmp% tree A
A
└── Excellent
    ├── bar
    ├── baz
    └── foo

1 directory, 3 files
~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
│   ├── barbar
│   ├── bazbaz
│   └── foofoo
└── Good

其中barbar的内容与 相同bar,并且bazbaz和 的内容也类似foofoo,那么

rdfind -deleteduplicates true A B

结果是

~/tmp% tree B
B
├── Bad
│   └── quux
├── Excellent
└── Good

替代解决方案如果你的 Ubuntu 版本不包含 rdfind:

你也可以使用fdupes

sudo apt-get install fdupes
fdupes --recurse --delete --noprompt A B 

相关内容