如何在命令行中删除目录B中目录A中的匹配文件?

如何在命令行中删除目录B中目录A中的匹配文件?

我的目录中有一些重复的文件AB如何B在 bash 中使用文件名删除重复的文件A

如何在其他 shell 中执行此操作是一个受欢迎的奖励。

答案1

单程:

#!/bin/bash
cd ~/B
for file in ~/A/*
do
    file1=$(basename "$file")
    [ -f "$file1" ] && { echo "deleting $file1 "; rm -- "$file1"; }
done

答案2

在一行中

grep -f <(ls "A") <(ls "B") | xargs -I'{}' rm "B/{}"

但它的工作原理仅取决于文件名,并且可能会影响空子目录。为了避免这种情况,find -type f -maxdepth 1请使用ls.

为了更安全地检查,请使用@KasyA receiveie。

答案3

find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;

在测试中:

$ ls -1 /path/to/dirA
dupfile
file1inA

$ ls -1 /path/to/dirB
dupfile
file1inB

find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;
rm -v /path/to/dirB/./dupfile

注意:删除echo用于空运行的。

答案4

cd B

ls ../
A
B

comm <(ls ../A) <(ls ./) -1 -2 -z | xargs -0 rm

comm显示三列,

  1. file1(A) 特有的
  2. file2(B) 独有的
  3. 两者都存在

所以我们将第 1、2 列删除-1 -2-z将使用 NULL 作为分隔符。默认为“\n”换行符。

当处理管道和任意字符串列表(如文件名)时,NULL 分隔传输是安全的。

相关内容