Vergleichen Sie die Liste der Dateien aus einer Datenbank mit find, um fehlende Dateien zu finden

572
jakethedog

Ich habe eine Liste von 2000 Dateien aus einer Datenbank, die folgendermaßen aussieht:

./aa/0f/unique-string/IMG_0987.JPG ./ab/cf/unique-string/IMG_0987.JPG 

Ich möchte diese Liste mit dem tatsächlichen Verzeichnisinhalt vergleichen, um fehlende Dateien zu identifizieren.

Der folgende Befehl funktioniert einzeln, aber nicht, wenn ich ein Skript schreibe ...

find . -false -samefile ./ab/cf/unique-string/IMG_0987.JPG 

Am nächsten bin ich gekommen:

#!/bin/bash TEST=`cat ./list.lst` find . -false -samefile "$TEST" 

Ich mache es falsch. was ist der richtige weg

1
Bitte schauen Sie sich meine Antwort an, um eine schnellere Lösung zu finden. MariusMatutiae vor 9 Jahren 0

2 Antworten auf die Frage

0
Jack

Ihr Suchbefehl verwendet den gesamten Inhalt von list.lst, da Sie ihn nicht durch jeweils eine Zeile füttern.

while read f; do find . -false -samefile "$f" done<./list.lst 

Dadurch wird die Datei list.lst jeweils 1 Zeile gelesen.

Das ist richtig, aber viel langsamer als nötig. Bitte sehen Sie meine Antwort. MariusMatutiae vor 9 Jahren 0
0
MariusMatutiae

Wenn Sie Ihrer Strategie folgen, machen Sie etwa 2000x2000 = 4.000.000 Vergleiche. Sie können es besser machen.

Angenommen, die Liste befindet sich in file_t1 ; Jetzt erzeugen wir zunächst eine Liste aller Dateien auf dem PC mit

 find . -type f > file_t2 

Dann sortieren wir beide Dateien:

 sort -n file_t1 > file1 sort -n file_t2 > file2 

Jetzt verwenden wir comm, um eine Liste der Unterschiede zu generieren:

 comm -X file1 file2 

woher:

 X = 12 -> lines that appear in **both** files X = 13 -> lines unique to file 2 X = 23 -> lines unique to file1 

Dies könnte auf Kosten der Übersichtlichkeit mit einem Einliner erfolgen.

Wenn Sie interessiert sind: Dies ist viel schneller, da die Dateien bereits sortiert sind (eine strikte Anforderung an comm ). Sie benötigen daher N- Schritte zum Vergleichen, wenn die Dateigröße N ist. Für die Sortierung sind N log N- Vorgänge erforderlich, was also der Fall ist Der teuerste Teil dieser Lösung, während der von Ihnen vorgeschlagene eine N ^ 2 -Operation erfordert, was für Ihre Dateigrößen erheblich länger ist.