Ich lade mehrere Dateien in einen Ordner herunter downloading
überHTTPie. Ein Bash-Skript soll heruntergeladene Dateien verarbeiten, und ich habe versucht, die heruntergeladenen Dateien in einen anderen Ordner zu kopieren, als
find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;
aber dadurch werden auch die Dateien kopiert, die noch nicht fertig sind. Ich habe versucht, die Übertragung auf ältere Dateien zu beschränken, indem ich -mmin +5
dem Befehl Folgendes hinzugefügt habe. Was ist der effizienteste Befehl, um die Dateien schreiben zu lassen und nur heruntergeladene Dateien zu übertragen?
Antwort1
Nicht sehr effizient, aber Sie könnten Folgendes tun:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
Überprüfen Sie daher vor dem Öffnen, dass die Datei nicht mit einem falschen w
Zugriffsmodus a
in der l
Liste s
der o
Pen- f
Dateien aufgeführt ist .m
v
Die psmisc
Implementierung von , fuser
wie sie typischerweise auf Linux-basierten Betriebssystemen zu finden ist, hat eine -w
Funktion (um zu prüfen, ob Dateien zum Schreiben geöffnet sind), aber leider funktioniert sie nur, -k
um die entsprechenden Prozesse zu beenden. Es scheint jedoch, dass Sie sie immer noch verwenden können, indem Sie das Pseudosignal 0 verwenden, das nichts bewirkt:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
Entfernen Sie das -s
(oder ersetzen Sie es durch -v
), wenn Sie sehen möchten, welcher/welche Prozess(e) die Verschiebung verhindert/verhindern.
Beachten Sie, dass Sie nur Informationen über Ihre Prozesse erhalten, wenn Sie diese Befehle nicht als Superuser ausführen. Wenn die Prozesse, die die Dateien herunterladen, unter einem anderen Benutzer ausgeführt werden, bleiben sie unentdeckt.
Beachten Sie auch, dass das Verschieben der Dateien den Prozess, der gerade in die Datei schreibt, nicht daran hindert, den Schreibvorgang abzuschließen, es sei denn, Sie verschieben die Dateien in ein anderes Dateisystem.
Abhängig davon, wofür sie konzipiert wurden, könnten sie jedoch verwirrt sein, wenn die Datei nach dem Schreiben nicht mehr vorhanden ist (zum Beispiel, wenn sie nach dem Herunterladen einige Attribute der Datei ändern möchten und dies tun).nichtüber den Dateideskriptor (wie chmod()
vs fchmod()
, oder utimes()
was nicht über einen Dateideskriptor möglich ist)).