Der Befehl find . -name '*2015*' -mmin +1440 -ls
wird wahrscheinlich tun, was Sie wollen. Siehe unten für Details.
Dein erster Befehl hatte -name 2015
. Es hat nicht funktioniert, da nur Dateien gefunden werden, deren Namen genau sind 2015
und keine anderen Zeichen enthalten.
Ihr zweiter Befehl ist find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
möglicherweise aus mehreren Gründen fehlgeschlagen:
1. Nicht zitierte *
Zeichen werden von der Shell erweitert und dann an weitergeleitet find
.
Wenn es irgendwelche Dateien direkt im enthaltenen aktuellen Verzeichnis (der du bist in , wenn Sie diesen lief find ...
Kommando) , deren Namen 2015
(und nicht mit einem Start .
), dann die Schale expandiert *2015*
in eine Liste dieser Dateinamen, dann übergeben diese Liste als Argumente für find
. Dies ist nicht das, was Sie wollen - stattdessen möchten Sie *2015*
buchstäblich als Argument übergeben, um zu finden, damit find
und nicht die Shell herausfinden kann, welche Dateien damit übereinstimmen.
Um dieses Problem zu beheben, zitieren Sie *2015*
. Es gibt drei gängige Methoden:
'*2015*'
(dh find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(dh find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(dh find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Ich schlage vor , das Schreiben es mit einfachen Anführungszeichen wie '*2015*'
, denn:
Aber in diesem Fall spielt es keine Rolle. '
und "
beide behandeln *
dasselbe und der Ausdruck ist nicht kompliziert genug, um zu \
zitieren, um es schwer zu verstehen.
2. -mtime +1
Wählt nur Dateien aus, die vor zwei oder mehr Tagen geändert wurden.
Wie man find
sagt:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
Angenommen, eine Datei wurde vor 47 Stunden geändert. Um herauszufinden , wie viele 24-Stunden - Perioden , die sind, find
Runden nach unten : Es ist ein Zeitraum von 24 Stunden vor. Aber -mtime +1
Matches nur Dateien , deren Änderungszeiten sind streng mehr als ein Zeitraum von 24 Stunden vor. Daher stimmen die Dateien von gestern nicht überein.
Siehe Warum gibt find -mtime +1 nur Dateien zurück, die älter als 2 Tage sind? Für weitere Informationen, wie von Steeldriver vorgeschlagen .
Um Dateien zu finden, die zuletzt vor mehr als 24 Stunden geändert wurden , empfehle ich stattdessen, sie als vor 1440 Minuten festzulegen mit -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Einige Leser fragen sich vielleicht, warum ich nicht zitiert habe {}
. Einige Leute zitieren {}
, um die Menschen daran zu erinnern, dass es kein Ausdruck für die Erweiterung der Zahnspange ist . Bourne-style Schalen (wie bash ) nicht benötigen {}
mit nichts drin zu zitieren. Vielleicht wird es von einer Shell außerhalb des Bourne-Stils besonders behandelt. Das könnte der Grund sein, warum einige Benutzer es zitieren. Es gibt aber auch ein Missverständnis, dass man manchmal zitieren muss {}
, -exec
um Dateinamen mit Leerzeichen korrekt zu behandeln. Die; s falsch: mit {}
oder '{}'
, find
erhält die gleichen Argumente, wie die Shell die Anführungszeichen entfernt , bevor er '{}'
zufind
. Um diesem Missverständnis entgegenzuwirken, zitiere ich nicht {}
, aber es ist eine Frage des Stils - wenn Sie lieber {}
dokumentieren möchten , wie die Shell nicht behandelt, {
und }
das ist in Ordnung.
Ich empfehle Ihnen auch, entweder Ihren ls
Befehl zu ändern oder (wie von muru vorgeschlagen ) durch die Aktion von find
's zu ersetzen -ls
. ls -ltrh
tut wahrscheinlich nicht das, was Sie beabsichtigen, da es für jede gefundene Datei separat ausgeführt wird und daher die Flags -t
und -r
, die die Sortierung angeben, irrelevant sind.
Obwohl die Ausgabe etwas anders formatiert wird als mit ls -l
, ist die Verwendung -ls
einfacher und einfacher.
find . -name '*2015*' -mmin +1440 -ls
Oder wenn Sie entscheiden, dass Sie wirklich nur die Dateinamen (einschließlich ihrer Pfade relativ zu .
) auflisten müssen, können Sie einfach keine Aktion angeben, wodurch die Standardaktion -print
verwendet wird:
find . -name '*2015*' -mmin +1440
find
Teil sieht für mich gut aus, aber ich hatte auch Probleme mit dem-exec
Parameter. Ich konnte das auch nicht zum Laufen bringen. (Ich habe versucht, alle JPG-Dateien von einem Ordner in das übergeordnete Verzeichnis zu verschieben - und habe es dann manuell gemacht ...)