
Ich habe einige doppelte Dateien in Verzeichnissen A
und wie kann ich die Duplikate mithilfe der Dateinamen in Bash B
löschen ?B
A
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 1
stattdessen 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 echo
es, es wird für den Probelauf verwendet.
Antwort4
cd B
ls ../
A
B
comm <(ls ../A) <(ls ./) -1 -2 -z | xargs -0 rm
comm
zeigt drei Spalten,
- eindeutig für Datei1(A)
- eindeutig für Datei2(B)
- existieren auf beiden
Wir löschen also Spalte 1 und 2 um -1 -2
. -z
Als 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.