Wie kopiere ich alle Dateien in einem Ordner mit Ausnahme der Dateien, die geschrieben werden?

Wie kopiere ich alle Dateien in einem Ordner mit Ausnahme der Dateien, die geschrieben werden?

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 +5dem 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 wZugriffsmodus ain der lListe sder oPen- fDateien aufgeführt ist .mv

Die psmiscImplementierung von , fuserwie sie typischerweise auf Linux-basierten Betriebssystemen zu finden ist, hat eine -wFunktion (um zu prüfen, ob Dateien zum Schreiben geöffnet sind), aber leider funktioniert sie nur, -kum 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)).

verwandte Informationen