コマンドラインでディレクトリ A からディレクトリ B に一致するファイルを削除するにはどうすればよいですか?

コマンドラインでディレクトリ A からディレクトリ B に一致するファイルを削除するにはどうすればよいですか?

Aディレクトリとに重複したファイルがいくつかあります。bashでファイル名を使用してB重複したファイルを削除するにはどうすればよいでしょうか?BA

他のシェルでそれを実行する方法は、嬉しいボーナスです。

答え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

comm3列表示、

  1. ファイル1(A)に固有
  2. ファイル2(B)に固有
  3. 両方に存在する

したがって、列 1、2 を削除します-1 -2-z区切り文字には NULL を使用します。デフォルトは `\n' 改行です。

パイプとファイル名のような任意の文字列のリストを扱う場合、NULL で区切られた転送は安全です。

関連情報