Zuletzt verwendete Dateien der Gesamtgröße kopieren

Zuletzt verwendete Dateien der Gesamtgröße kopieren

Ich möchte die zuletzt verwendeten (oder ggf. erstellten) Dateien einer bestimmten Größe in einen anderen Ordner kopieren. Ist dies ohne zusätzliche Tools möglich?

Ich habe ein USB-Laufwerk einer bestimmten Größe, die kleiner ist als die Gesamtgröße eines Ordners. Da ich nicht alle Dateien auf das USB-Laufwerk kopieren kann, kopiere ich gerne basierend auf der letzten Nutzung, bis kein Platz mehr vorhanden ist. Idealerweise unterstützt die Methode auch das Aktualisieren der Dateien, ohne dass alle Dateien gelöscht und erneut kopiert werden müssen.

Antwort1

Unter der Annahme (basierend auf dem Tag [linux]), dass Sie über bashdie Befehle und verfügen stat; sortunter der weiteren Annahme, dass Sie zuerst die zuletzt geänderten Dateien synchronisieren möchten (sieheMann Statistikfür andere Zeitstempeloptionen), dann ist hier ein Bash-Skript, das alle Dateien im aktuellen Verzeichnis durchläuft ( for f in *ist die Schlüsselzeile hierfür), ihre Zeitstempel der letzten Änderung in einem Array sammelt, dann die sortierten Zeitstempel durchläuft und – ein Beispiel! – für jede Datei einen rsync-Befehl ausgibt (derzeit sind Informationen zum Debuggen von Zeitstempeln als Beweis angehängt).

Sie müssen den rsync-Befehl natürlich an Ihre spezielle Situation anpassen. Dieses Skript gibt rsync-Befehle für jede Datei im aktuellen Verzeichnis aus. Mein Vorschlag wäre, diese rsyncs entweder „blind“ auszuführen und die am Ende fehlschlagen zu lassen oder sie in ein Skript zu packen, das separat ausgeführt wird.

Dieses Skript versucht in keiner Weise, die Speicherplatznutzung des Ziels zu optimieren. Die einzige Sortierung, die es vornimmt, ist der Zeitstempel der letzten Änderung (und die willkürliche Sortierung des assoziativen Arrays, falls mehrere Dateien in derselben Sekunde geändert werden).

#!/usr/bin/env bash
declare -A times

# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
  [ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done

# get the times in (unique) sorted order
for times in ${times[@]}
do
  echo $times
done | sort -run | while read t
do
  # then loop through the array looking for files with that modification time
  for f in "${!times[@]}"
  do
    if [[ ${times[$f]} = $t ]]
    then
      echo rsync "$f" -- timestamp ${times[$f]}
    fi
  done
done

Antwort2

Sie sollten Ihre Dateien nach Änderungsdatum sortieren und dann die Namen in dieser Reihenfolge rsynczum Kopieren übergeben. Sie können stattdessen auch verwenden cp, aber rsyncdas ist effizienter.

Auf superuser.com gibt es bereits einen Thread dazu:https://superuser.com/a/208749/554082

verwandte Informationen