
Wie kann ich Dateien in einem Ordner basierend auf dem Zeitpunkt der letzten Bearbeitung kopieren? Nehmen wir an, ich möchte alle meine Dateien kopieren, die ichzuletzt bearbeitet heuteausC:in meinen Ordnerzurück. Wie kann ich das erreichen?
Ich weiß, dass ein normaler Kopierbefehl wie folgt ausgeführt werden kann:
cp source destination
z.B.
cp *.c bak
Irgendwelche Vorschläge?
Antwort1
Mit „find“ lassen sich die Dateien (und nur die Dateien), die am letzten Tag geändert wurden, wie folgt finden:
find . -type f -mtime 1
so dass Sie sie kopieren können mit
find . -type f -mtime 1 -exec cp {} bak/ \;
Bedeutung: Suche nach allen Entitäten im aktuellen Verzeichnis ( .
), vom Typ "Datei" ( -type f
),geändert in mindestens 1 Tag ab jetzt( -mtime 1
, aber es ist subtil, folgen Sie dem Link, um mehr zu erfahren), und führen Sie für jeden von ihnen den Befehl aus, cp
gefolgt vom Namen der Datei, die die vorherigen Bedingungen erfüllt, und von einem Literal bak/
--- in der exec
Klausel. Das schließende Semikolon (maskiert, damit es nicht von der Shell gelesen wird) schließt den Befehl und bedeutet zusätzlich, dass der Befehl einmal für jede Übereinstimmung ausgeführt werden soll.
Beachten Sie, dass die Verzeichnisstruktur im bak/
Ordner abgeflacht wird. Daher wäre die Verwendung eines Archivformats möglicherweise besser.
Dies ist beispielsweise mein Skript, das eine Sicherungskopie aller heute und seit zwei Tagen geänderten Dateien in meinen Arbeitsverzeichnissen in TAR-Dateien erstellt und diese dann in mein Dropbox-Verzeichnis verschiebt:
#! /bin/zsh
#
cd $HOME
today="today-$(hostname)".tar
twodays="twodays-$(hostname)".tar
mydirs=(bin Documents Templates texmf Desktop) # list your top-level working dirs here
rm -f $today $twodays
echo -n "Starting today and twodays backups... "
find $mydirs -type f -mtime -1 -exec tar rf $today {} +
find $mydirs -type f -mtime -2 -exec tar rf $twodays {} +
echo "backups done:"
ls -lh $today $twodays
echo "Moving to Dropbox"
mv $today $twodays $HOME/Dropbox
sleep 2
dropbox status
es ist nötig zsh
, weil ich faul bin und nicht versucht habe, es an die Array-Struktur von anzupassen bash
, aber das kann hier sicherlich jemand tun (kleiner Hinweis) …
Antwort2
Sie können zunächst mit dem Befehl angeben, welche Datei Sie zuletzt in Ihrem aktuellen Ordner geändert haben
ls -lt
Oder Sie möchten angeben, auf welche Datei Sie zuletzt mit dem Befehl zugegriffen haben
ls -ltu
Anschließend können Sie die Datei mit cp
dem Befehl kopieren. Informationen zum Kopieren mehrerer Dateien finden Sie unterDas.