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

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

私のディレクトリにはいくつかの重複ファイルがあります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. file2(B) 固有
  3. どちらも存在する

したがって、列1と2を削除します-1 -2-zNULL は区切り文字として使用されます。デフォルトは「\ n」改行文字です。

NULL で区切られた転送は、パイプや任意の文字列のリスト (ファイル名など) を処理するときに安全です。

関連情報