Ich besitze ein E-Mail-Konto mit über 60 GB E-Mail-Kapazität und habe derzeit große Probleme, E-Mails des letzten Jahres (2011) mit einem E-Mail-Client zu archivieren.
Über das Terminal versuche ich, find zu verwenden, um die Dateien zwischen dem 01.01.2011 und dem 31.12.2011 zu finden, aber ohne Erfolg.
Wie finde ich Dateien zwischen zwei Daten?
Falls relevant, ist das Endziel ein Stapel, der jede gefundene Datei, die dem Datumsintervall entspricht, in einen Ordner verschiebt.
command-line
find
Zuul
quelle
quelle
Antworten:
Sie können dieses Skript verwenden:
quelle
find
sollte nicht in einer solchen Shell-for
Schleife verarbeitet werden , es sei denn, es wird garantiert, dass keine Datei Leerzeichen im Namen enthält.-exec
,,-execdir
oder-print0 | xargs
sollte normalerweise stattdessen verwendet werden; Eine andere mögliche Lösung, die normalerweise weniger wünschenswert ist, jedoch die Verwendung einerfor
Schleife zulässt , besteht darin, vorübergehend festzulegen,IFS
dass ein Leerzeichen nicht als Feldtrennzeichen erkannt wird.find
mitexec
? Würde es Ihnen etwas ausmachen, eine Antwort hinzuzufügen, die sich mit der Verwendung von Leerzeichen befasst? Sehr geschätzt.exec
Befehl nicht. Verwenden Sie einenfind
Befehl mit der-exec
auszuführenden Aktionmv
oder was auch immer Sie ausführen müssen, wie in der Antwort beschrieben . Wennfind
...-exec
Ihren Befehl mit den gefundenen Pfadnamen ausführt, wird keine Shell verwendet, sodass Leerzeichen keine Worttrennung oder Globbing auslösen . (Vielleicht möchten Sie eine neue Frage zu Ihrem speziellen Fall stellen oder genau das fragen, was Sie wissen möchten.)Bash-Find-Dateien zwischen zwei Daten:
Gibt eine Liste von Dateien mit Zeitstempeln nach dem 07.10.2010 und vor dem 08.10.2014 zurück
Bash finde Dateien von vor 15 Minuten bis jetzt:
Gibt eine Liste von Dateien mit Zeitstempeln nach 15 Minuten vor, aber vor jetzt zurück.
Bash-Find-Dateien zwischen zwei Zeitstempeln:
Gibt Dateien mit Zeitstempeln zwischen
2014-10-08 10:17:00
und zurück2014-10-08 10:53:00
quelle
Verschieben der Dateien und Aufforderung an den Benutzer, wenn doppelte Namen vorhanden sind:
Wie die Antworten von Subv3rsion und Eric Leschinski zeigen,
-newermt
wählt das Prädikat Dateien aus, die in jüngerer Zeit als das als Operand angegebene Datum (und die optionale Uhrzeit) geändert wurden. Dateien findensrcdir
(dh einschließlich seiner Unterverzeichnisse, deren Unterverzeichnisse usw.)destdir
...Du kannst rennen:
In einem
-exec
Ausdruck übergibt find den Dateinamen, der anstelle von gefunden wurde{}
.;
bedeutet,-exec
dass der auszuführende Befehl und seine Argumente alle angegeben wurden (falls nachfolgende Ausdrücke übergeben werden, um nach-exec
den Argumenten dieses bestimmten Prädikats zu suchen - siehe unten für ein Beispiel hierfür).;
Es muss maskiert werden,\;
damit es von der Shell nicht speziell interpretiert wird. (Ohne\
,;
würde den gesamten Ende -find
Befehls, das gleiche wie eine neue Zeile zu arbeiten. Auch wenn dieserfind
Befehl nichts nach dieser hat-exec
Ausdruck, in Ermangelung des passiert;
Argument ist immer noch ein Syntaxfehler.)Wenn Sie nur die Dateien auflisten möchten - was ratsam ist, wenn Sie nicht sicher sind, wie die alten E-Mails gespeichert sind oder welche anderen Dateien möglicherweise vorhanden sind -, lassen Sie
-exec
alles rechts davon weg. (Bei E-Mails werden häufig E-Mails mit unterschiedlichen Datumsangaben in derselben Datei gespeichert. Bei Personen, die sich in der hier beschriebenen Situation befinden, empfehle ich, vor dem Verschieben von Dateien zu untersuchen, wie sie gespeichert werden.) Wenn Sie ihre Namen drucken und verschieben möchten sie, fügen Sie-print
vor-exec
.mv -i
Eingabeaufforderungen, wenn eine Datei am Ziel überschrieben wird, z. B .:srcdir
bereits während derselben verschobenfind
Betriebes odersrcdir
während des gleichenfind
Vorgangs irgendwo in erstellt , nachdem das Original verschoben wurde, aber bald genug, um gefunden zu werden, sobaldfind
ein anderes Unterverzeichnis durchlaufen wurde.Andere Möglichkeiten zum Aufrufen
rm
:Sie haben andere Möglichkeiten, um mit Dateien mit doppelten Namen umzugehen.
-i
(dh ) wird normalerweise keine Genehmigung angefordert, dies wird jedoch durchgeführt, wenn die Zieldatei schreibgeschützt ist. ( Manchmal kann es sogar gelingen, eine schreibgeschützte Datei zu überschreiben, z. B. wenn der Benutzer, der sie ausführt, Eigentümer der Datei ist.)mv {} destdir/
mv
mv
mv
immer versuchen möchten , Dateien mit identischen Namen zu überschreiben, verwenden Siemv -f
.mv -n
.mv
Akzeptiert die Flags-b
und--backup
, um automatisch Dateien mit identischen Namen umzubenennen, die bereits am Ziel vorhanden sind. Standardmäßig~
wird hinzugefügt, um den Sicherungsnamen zu erstellen. Wenn am Ziel bereits eine Datei mit dem Namen und eine Datei mit dem Sicherungsnamen vorhanden ist, wird die Sicherungsdatei überschrieben. Diese Standardeinstellung kann durch beim Aufrufen übergebene Optionenmv
und durch Umgebungsvariablen überschrieben werden . Sehen Sieman mv
für weitere Details und das folgende Beispiel.Verschieben der Dateien und Erstellen von Backups bei doppelten Namen:
Um alle Dateien zu verschieben, sichern Sie Dateien mit doppelten Namen mit einem
~
Suffix und verwenden Sie nummerierte Suffixe, wenn Dateien bereits vorhanden sind (um ein Überschreiben zu vermeiden):.~n~
.~
Wenn Sie Dateien mit doppelten Namen übersprungen haben und wissen möchten, welche:
Wenn Sie verwenden
mv -n
und wissen möchten, welche Dateien nicht verschoben wurden, weil es eine andere Datei mit demselben Namen gab, ist es wahrscheinlich die beste Möglichkeit, den ursprünglichenfind
Befehl erneut auszuführen , ohne-exec
und alles rechts davon. Dadurch werden ihre Namen gedruckt.Es werden auch die Namen aller übereinstimmenden Dateien gedruckt, die seit der Ausführung des ursprünglichen
find .... -exec ...
Befehls erstellt wurden. Für diese Anwendung ist jedoch in der Regel keine vorhanden, da nach Dateien mit alten Änderungszeiten gesucht wird. Es ist möglich, einer Datei einen Änderungszeitstempel zuzuweisen, der älter ist als ihr tatsächliches Alter,touch
sowie andere Mechanismen, aber dies scheint in diesem Fall ohne Ihr Wissen nicht wahrscheinlich zu sein.Sofortige Kenntnis, da Dateien aufgrund doppelter Namen übersprungen werden:
mv -n
meldet keinen speziellen Exit-Code und gibt auch keinen speziellen Exit-Code zurück , wenn keine Datei verschoben wird. Wenn Sie also sofort während der Ausführung über übersprungene Dateien informiert werden möchten, müssenfind
Sie einen separaten Schritt dafür ausführen. Ein Weg ist:Einige wahrscheinlich geringfügige technische Überlegungen: Dies warnt fälschlicherweise, wenn
mv
eine Datei aus einem anderen Grund als dem am Zielort vorhandenen nicht kopiert werden kann, und beendet die Berichterstellung . Das scheint unwahrscheinlich, aber ich bin nicht sicher, ob es unmöglich ist. Möglicherweise leidet es auch unter einer Race-Bedingung : Es würde warnen, wenn überhaupt kein wirklicher Fehler vorliegt, wenn eine neue Datei mit demselben Namen an derselben Stelle in der sehr kurzen Zeit nach dem Verschieben der alten Datei und vor dem Überprüfen auf erstellt wurde sehen Sie, ob es entfernt wurde. (In Anbetracht der Anwendung bezweifle ich, dass eines der Probleme jemals tatsächlich auftreten würde.) Es könnte neu geschrieben werden, um das Ziel vorher zu überprüfenVerschieben der Datei statt nachher: Die Race-Bedingung bezieht sich dann auf neu erstellte Zieldateien anstelle von Quelldateien. Und während vonfind
oder gemeldete Fehler und Warnungenmv
(oder[
, obwohl es keine geben sollte) in den Standardfehler geschrieben werden , wird unsere...skipped (exists in...
Warnung in die Standardausgabe geschrieben . Normalerweise werden beide auf Ihrem Terminal angezeigt. Dies kann jedoch von Bedeutung sein, wenn Sie Skripte erstellen.Ich habe diesen Befehl zum leichteren Lesen in zwei Zeilen aufgeteilt. Es kann auf diese Weise ausgeführt werden, oder Sie können die
\
und die neue Zeile (dh den Zeilenumbruch) entfernen .Wie funktioniert dieser
find
Befehl?find
Prädikate können Tests (wie-type
und-newermt
) sein, die für ihre Rückgabewerte verwendet werden, oder Aktionen (wie-print
und-exec
), die häufig für ihre Nebenwirkungen verwendet werden.Wenn zwischen Ausdrücken kein Operator (wie
-a
für und ,-o
für oder ) angegeben wird,-a
wird impliziert.find
setzt Kurzschlussauswertung für und und oder ein . (dh ) ist nur dann wahr, wenn die Ausdrücke p und q beide wahr sind, daher muss q nicht ausgewertet werden, wenn p falsch ist. Obwohl wir oft nicht in diesen Begriffen darüber nachdenken, müssen Tests wahr sein, damit nachfolgende Aktionen oder Tests ausgewertet werden können. Angenommen , ein Verzeichnis wird gefunden. Es wird mit false ausgewertet , sodass anschließend alles übersprungen werden kann.p q
p -a q
find
-type f
Aktionen werden ebenso wie Tests mit wahr oder falsch bewertet. Auf diese Weise wird
-exec
gemeldet , ob der ausgeführte Befehl erfolgreich war (true) oder fehlgeschlagen ist (false). Wir haben diese-exec
Ausdruckskette mit implizitem und verbunden :Dadurch wird versucht, die Datei zu verschieben, und wenn ein
mv
Fehler gemeldet wird, wird der Vorgang beendet. Wir möchten nicht vor einer korrekt übersprungenen Datei warnen, wenn ein anderes Problem darin bestand, dass sie nicht verschoben wurde.Wenn dies jedoch erfolgreich war, wird der
[
Befehl ausgeführt . Wiefind
,[
unterstützt seine eigene Art von Ausdrücken als Argumente übergeben.[ -f {} ]
überprüft , ob der Operand nach-f
(durch an sie übergebenfind
statt{}
) vorhanden ist (und eine reguläre Datei), und gibt entweder true / Erfolg oder falsch / Versagen.(Der Exit-Status vieler Befehle wird am besten als Zeichen für Erfolg oder Misserfolg interpretiert, aber
[
der vorhandene Status wird normalerweise am besten als wahr oder falsch interpretiert.)Wenn
[
false zurückgegeben wird, ist die Datei verschwunden und wurde verschoben, sodass keine weiteren Schritte erforderlich sind. Aber wenn[
false zurückgegeben wird, ist die Datei immer noch da. Dannfind
wertet den nächsten-exec
Ausdruck, der die Warnmeldung ausgibt.Weitere Lektüre
man find
und das GNU Findutils Referenzhandbuchman mv
und das GNU Coreutils Referenzhandbuch (insbesondere 11.4mv
: Verschieben (Umbenennen) von Dateien )man \[
und 16.3 test: Überprüfen Sie die Dateitypen und vergleichen Sie die Werte in den Coreutils-Dokumenten.Dies (dh
/usr/bin/[
) und nicht das[
eingebaute Shell- Element wird ausgeführt ,find
wenn Sie es verwenden-exec [
.quelle
-exec ... +
mit hinzuzufügenmv -t
.