
Finden Sie heraus, ob Dateien in einem Verzeichnis rekursiv in einem anderen Verzeichnis vorhanden sind, und drucken Sie sie in Linux Bash rekursiv, um festzustellen, ob sie vorhanden sind oder nicht.
sagen wir, Sie haben
pth1/dirA/file1
pth1/dirA/DirB/file2
Undpth2/dirA/file1
pth2/dirA/DirB/file3
Ich möchte einen Bericht, der
file1 exists
files2 dont exist in pth2
files3 dont exist in pth1
ich habe den Code gefunden, der für die aktuelle Ebene für beide Verzeichnisse funktioniert, aber ich kann ihn nicht rekursiv zum Laufen bringenvon hier genommen
pth1="/mntA/newpics";
pth2="/mntB/oldpics";
for file in "${pth1}"/*; do
if [[ -f "${pth2}/${file##*/}" ]]; then
echo "$file exists";
fi
done
Wie kann ich es schaffen, rekursiv auf beiden Pfaden zu arbeiten?
Antwort1
Ich habe es mit einer anderen Methode gemacht. Ich finde alle Dateien in einem Verzeichnis, entferne ihren Pfad, dann kann ich die Ergebnisse in zwei verschiedenen Dateien speichern und sie mit Meld oder einem anderen Programm vergleichen, oder ich kann Funde direkt mit Meld vergleichen.
Beachten Sie, dass ich Dateien sortiere und in den Ergebnissen nur eindeutige Dateien und keine Duplikate auswähle. Außerdem bin ich nur an Dateien interessiert, deren Dateiname mit der Erweiterung „jpg“ endet.
pth1="/mnt/oldfiles";
pth2="/mnt/newfiles";
und dann
(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > a.txt;
(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > b.txt;
meld a.txt b.txt
ODER direkt
meld <(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) <(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )
UPDATE: Wenn ein Verzeichnis viel größer als das andere ist, funktioniert der direkte Befehl nicht (MILD wird geöffnet, ohne dass beide Befehle abgeschlossen werden).
Antwort2
Es ist nicht ganz klar, was Sie wollen, aber ich denke, das hier wird es tun. Dieser Befehl vergleicht alle Dateien unter /path/1
mit denen unter /path/2
und prüft auf Existenz und Gleichheit.
diff --brief --recursive /path/1 /path/2
Ausgearbeitetes Beispiel
# Create some files
mkdir -p 1/{x,y} 2/{x,z}
touch 1/{x,y}/file1
date | tee 2/x/file1 >2/z/date
# Show what we have
tree 1 2
1
├── x
│ └── file1
└── y
└── file1
2
├── x
│ └── file1
└── z
└── date
4 directories, 4 files
# Compare the two directory trees
diff --brief --recursive 1 2
Files 1/x/file1 and 2/x/file1 differ
Only in 1: y
Only in 2: z