
A
ディレクトリとに重複したファイルがいくつかあります。bashでファイル名を使用してB
重複したファイルを削除するにはどうすればよいでしょうか?B
A
他のシェルでそれを実行する方法は、嬉しいボーナスです。
答え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 のレシピを使用してください。
答え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
3列表示、
- ファイル1(A)に固有
- ファイル2(B)に固有
- 両方に存在する
したがって、列 1、2 を削除します-1 -2
。-z
区切り文字には NULL を使用します。デフォルトは `\n' 改行です。
パイプとファイル名のような任意の文字列のリストを扱う場合、NULL で区切られた転送は安全です。