Ist es möglich, die Ausgabe find … -exec ls -ls ;
alpabetisch zu sortieren, nach Dateinamen?
Dies ist mein Cron-Befehl:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Dieser Befehl funktioniert größtenteils in Ordnung. Die Ergebnisse sind jedoch nicht in einer sinnvollen Reihenfolge sortiert. Es wäre sehr hilfreich, wenn sie nach dem Dateinamenfeld sortiert wären.
ls -ls **/*(.)
ls
würde sortieren.Antworten:
Ich gehe davon aus, dass Ihre Dateinamen keine Zeilenumbrüche enthalten.
Wenn Sie die Aktion beenden,
+
anstatt sie;
zu verwenden,-exec
wird sie durch Stapeln der Aufrufe von beschleunigtls
. Sie können sortieren, indem Sie densort
Befehl weiterleiten. Sagen Sie ihm, dass er beim 10. Feld mit dem Sortieren beginnen soll (die ersten 9 sind die Metadaten: Blöcke, Berechtigungen, Linkanzahl, Benutzer, Gruppe, Größe und 3 Datums- / Zeitfelder). Die Option-n
sagtls
numerische Werte für den Benutzer und die Gruppe zu verwenden, die das Risiko von Benutzer- oder Gruppennamen vermeidet enthält Leerzeichen.Alternativ dazu können Sie mit zsh ohne jede Annahme eines Namens davonkommen, indem Sie Glob-Qualifikationsmerkmale verwenden , um die Dateien zu sammeln und zu sortieren und mehrmals
zargs
auszuführen,ls
wenn die Befehlszeile zu lang wäre. Du brauchst GNUls
(speziell seine-f
Option), um eine Neu-Sortierung zu vermeidenls
(ein anderer Ansatz wäre,ls
mit zshs zu emulierenzstat
).quelle
Warum nicht das Ergebnis von find through sort leiten und dann ls für jede der Zeilen ausführen?
quelle
POSIX hat Folgendes zu Terminen in einer
ls
-l
Liste zu sagen :In Anbetracht dessen und um sicherzustellen, dass Zeilenumbrüche in einem Dateinamen mit der ebenfalls von POSIX angegebenen
ls -q
Option ordnungsgemäß entfernt werden , ist es relativ einfach, einen regulären Ausdruck für einls
Ergebnis zu erstellen, ohne dassfind
:grep
dafür und Sie werden nur Zeilen zurückgeben, die die Zeichenfolgen enthalten, die entweder das heutige oder das gestrige Datum darstellen. Der folgende Befehl fügt dem ein wenig hinzu:ls
Optionen bestehen aus:-a
Alle Dateien in einem Verzeichnis zurückgeben - einschließlich der Dateien, die mit einem beginnen.dot
-l
lange Liste-R
Listen Sie alle untergeordneten Verzeichnisse rekursiv auf-c
Änderungszeit anstatt Zugriffszeit anzeigen-q
Geben Sie das Shell-Glob zurück,?
anstatt nicht druckbare oder\t
ab-Zeichen in einem DateinamenDiese Ergebnisse werden über die
|pipe
Datei übertragen, fürsed
die nur Folgendes zutrifft:-
(also nichtd
für Verzeichnisse) beginnen und auch Ihre enthaltendate
.Die Ausgabe sieht folgendermaßen aus:
Ja, es funktioniert sogar mit
LS_COLORS
- was für Siecron
natürlich wahrscheinlich eine niedrige Priorität hat , aber Ihre Optionen sind offen.In jedem Fall bietet dies einige wesentliche Vorteile gegenüber einigen anderen möglichen Lösungen.
Erstens beinhaltet
find
+ls
mehrere Aufrufe - dies betrifft nur einen einzigenls
Prozess, und deshalb ist es in der Lage, alles zuverlässig zu sortieren - was es standardmäßig tut - und wird dahersort
auch zur Nebensache gemacht.Jede Lösung beteiligt
find
undsort
undls
ist ziemlich viel zu tun all die Arbeit zweimal.ls
undfind
wird sowohl jeden Pfadnamen als auchstat
jede Datei auflösen .ls
undsort
werden beide alle Ergebnisse sortieren. Es ist wahrscheinlich am besten, nur die Single zu verwendenls
.Dann gibt es natürlich die
date
undsed
Teile dieser Antwort. Das Wichtigste dabei ist, dass Sie den schwierigen Teil erledigen und den regulären Ausdruck zuerst - und nur einmal - abrufen und anschließend nur eine einzelne Liste von Ergebnissen beschneiden, anstatt zu sagen, Ergebnisse abzurufen, Ergebnisse abzurufen, Ergebnisse zu sortieren und Ergebnisse zu sortieren.Dies funktioniert nicht bei Dateinamen, die Zeilenumbrüche enthalten, wie dies bei anderen Lösungen wahrscheinlich der Fall sein wird. Diese Lösung hat ihre eigenen Vorbehalte - die ich als nächstes erkläre - aber sie sind winzig und leicht zu handhaben. Meiner Meinung nach ist dies die robusteste Lösung hier.
Es gibt zwei Fälle, in denen der obige Befehl Probleme verursachen kann. Das erste
?
Problem betrifft die Globs in den Dateinamen. Da es sich bereits um eine robustere Lösung als alle anderen hier angebotenen handelt und die Wahrscheinlichkeit, dass Sie überhaupt auf einen stoßen,?
gering genug ist, besteht die Möglichkeit, dass diese Globs aufgelöst werden könnte mit mehr als einem Dateinamen übereinstimmen. Bitte beachten Sie dies , um weitere Informationen zu diesem Thema.Die andere Möglichkeit ist ein falsches Positiv - zum Beispiel, wenn Sie einen Dateinamen haben, der tatsächlich mit der
date
Zeichenfolge übereinstimmt, mit der wir suchen, dergrep
aber an keinem dieser Tage tatsächlich geändert wurde. Ich zähle nicht darauf, dass dies ein Problem ist, aber wenn ja, fragen Sie danach, und ich kann Ihnen wahrscheinlich dabei helfen, die Regex zu präzisieren, um damit umzugehen.quelle
Sie können tatsächlich eine Kombination aus find, xargs und ls verwenden.
Hier ist ein Beispielbefehl:
find . -type f -print0 | xargs -0 ls -lt
find
sucht rekursiv nach allen Dateien im aktuellen Verzeichnis.ls
in einem einzigen Aufruf an den Befehl (sofernfind
weniger alsARG_MAX
Dateien zurückgegeben werden).ls -lt
sortiert diese Dateien nach Zeit und formatiert die AusgabeUm Ihr System abzurufen, können
ARG_MAX
Sie Folgendes eingeben:quelle
quelle
ls
Sorgt für eine eigene Sortierung, sodass die Ausgabe vonfind
Throughsort
unbrauchbar ist. Außerdem werden durch Ihren Befehl Dateinamen, die (unter anderem) Leerzeichen enthalten, unleserlich gemacht, und es treten Fehler auf, wenn zu viele Dateinamen vorhanden sind.