Ich möchte alle Protokolldateien auflisten, die heute nicht gehören, und nur die Dateien, die 2015
in ihren Namen enthalten sind.
Dies sind die Befehle, die ich versucht habe:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
Die Ausgabe von beiden ist nichts, aber dennoch sind Dateien vorhanden. Mit diesen Befehlen stimmt etwas nicht, und ich verstehe nicht, was. Jede Hilfe wäre dankbar.
command-line
find
rɑːdʒɑ
quelle
quelle
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 ...)2015
ihrem Namen gäbe (das andere offensichtliche Manko der Art und Weise, wie der Befehl geschrieben wird), vermute ich, dass es irgendeine Art von Ausgabe geben würde. Vielleicht möchten Sie eine Antwort dazu posten.Antworten:
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 sind2015
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 weitergeleitetfind
.Wenn es irgendwelche Dateien direkt im enthaltenen aktuellen Verzeichnis (der du bist in , wenn Sie diesen lief
find ...
Kommando) , deren Namen2015
(und nicht mit einem Start.
), dann die Schale expandiert*2015*
in eine Liste dieser Dateinamen, dann übergeben diese Liste als Argumente fürfind
. Dies ist nicht das, was Sie wollen - stattdessen möchten Sie*2015*
buchstäblich als Argument übergeben, um zu finden, damitfind
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*'
(dhfind . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)"*2015*"
(dhfind . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)\*2015\*
(dhfind . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)Ich schlage vor , das Schreiben es mit einfachen Anführungszeichen wie
'*2015*'
, denn:\
kann es schwierig machen, genau zu sehen, was von der Shell an denfind
Befehl übergeben wird."
beinhaltet manchmal etwas komplizierte Regeln .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: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
: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 vonfind
'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.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:quelle
newerXY
Syntax, die Kalenderargumente akzeptiert, zB-newermt 'yesterday'
und! -newermt 'yesterday'
Zitieren Sie den Ausdruck und ich schlage vor, dass Sie auch die Klammern zitieren
oder
Sie müssen die gefundenen Dateien nicht an ls übergeben
quelle
-type f
? Und wennls
verwendet werden muss, schlagen Sie vor-ls
.In zsh können Sie verwenden Glob-Qualifizierer verwenden (dies ist eine einzigartige zsh-Funktion, die in anderen Shells wie bash nicht verfügbar ist).
Dies listet nur Dateien im aktuellen Verzeichnis auf. zuVerwenden Sie rekursiven Durchlaufen von Verzeichnissen
Mit
find
,-name 2015
findet nur Dateien , deren Namen genau2015
.-name *2015*
Funktioniert nur, wenn keine Dateien vorhanden sind, deren Name2015
im aktuellen Verzeichnis enthalten ist, da die Shell das Muster erweitert,*2015*
bevorfind
es aufgerufen wird. Sie müssen das Muster zitieren:Beachten Sie, dass sowohl
find -mtime +1
als auch zsh*(m+1)
Dateien finden, die mindestens 48 Stunden alt sind , und keine Dateien, die älter als heute sind. Das Pluszeichen bedeutet „streng mehr als“ und die Anzahl der Tage wird abgerundet. Verwenden Sie-mtime +0
oder, um Dateien zu finden, die mindestens 24 Stunden alt sind(m+0)
.Wenn Sie Dateien zu finden , die zuletzt geändert wurden gestern oder vor , können Sie
find
mit dem-newermt
Prädikat :Es gibt keine wirklich bequeme Möglichkeit, diesen Test in zsh durchzuführen.
quelle