我的目录中有一些重复的文件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 分隔传输是安全的。