![如何在命令行中删除目录B中目录A中的匹配文件?](https://linux22.com/image/59629/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95B%E4%B8%AD%E7%9B%AE%E5%BD%95A%E4%B8%AD%E7%9A%84%E5%8C%B9%E9%85%8D%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我的目录中有一些重复的文件A
,B
如何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
显示三列,
- file1(A) 特有的
- file2(B) 独有的
- 两者都存在
所以我们将第 1、2 列删除-1 -2
。-z
将使用 NULL 作为分隔符。默认为“\n”换行符。
当处理管道和任意字符串列表(如文件名)时,NULL 分隔传输是安全的。