Wie entferne ich in der Befehlszeile übereinstimmende Dateien aus Verzeichnis A in Verzeichnis B?

Wie entferne ich in der Befehlszeile übereinstimmende Dateien aus Verzeichnis A in Verzeichnis B?

Ich habe einige doppelte Dateien in Verzeichnissen Aund wie kann ich die Duplikate mithilfe der Dateinamen in Bash Blöschen ?BA

Dass dies in anderen Shells funktioniert, ist ein willkommener Bonus.

Antwort1

Ein Weg:

#!/bin/bash
cd ~/B
for file in ~/A/*
do
    file1=$(basename "$file")
    [ -f "$file1" ] && { echo "deleting $file1 "; rm -- "$file1"; }
done

Antwort2

In einer Zeile

grep -f <(ls "A") <(ls "B") | xargs -I'{}' rm "B/{}"

Die Funktion hängt jedoch nur vom Dateinamen ab und kann sich auf leere Unterverzeichnisse auswirken. Um dies zu vermeiden, verwenden Sie find -type f -maxdepth 1stattdessen ls.

Verwenden Sie für eine sicherere Prüfung das @KasyA-Rezept.

Antwort3

find /path/to/dirA -type f -exec cmp -s '{}' '/path/to/dirB/{}' \; -exec echo rm -v '/path/to/dirB/{}' \;

In einem Test:

$ 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

Hinweis: Entfernen Sie echoes, es wird für den Probelauf verwendet.

Antwort4

cd B

ls ../
A
B

comm <(ls ../A) <(ls ./) -1 -2 -z | xargs -0 rm

commzeigt drei Spalten,

  1. eindeutig für Datei1(A)
  2. eindeutig für Datei2(B)
  3. existieren auf beiden

Wir löschen also Spalte 1 und 2 um -1 -2. -zAls Trennzeichen wird NULL verwendet. Standard ist „\n“-Zeilenumbruch.

Beim Umgang mit Pipes und Listen beliebiger Zeichenfolgen wie Dateinamen ist die durch NULL getrennte Übertragung sicher.

verwandte Informationen