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.
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
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.
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.