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.

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.

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 Und
  • pth2/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/1mit denen unter /path/2und 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

verwandte Informationen