2014-01-07 3 views
5

i den folgenden Befehl verwenden, um eine Liste der Dateien zu erzeugen, die ich manchmal vergleichen, um zu sehen, ob es etwas geändert wird:„finden -ls“ mit dem richtigen Zeit-Stil

find /directory -xdev -ls 

Mein Problem ist, dass die Zeit in der Ausgabe ist nicht immer im gleichen Format:

Sep 19 08:48 ./pool/f/f/0/ff046cc5b7188073cbd68207c52bddc5 
Nov 2 06:24 ./pool/f/f/0/ff0e803c36d89315a6b3663ed1295f71 
Jan 18 2012 ./pool/f/f/0/ff07f60465d8deb7a1aa38096d0b798d 
Jan 18 2012 ./pool/f/f/0/ff07436f519bddf1d340afde5a240375 

für den ls-Befehl gibt es die Option --time-Format = long-iso das gleiche Zeitformat für alle Dateien zu erzwingen. Ist es möglich, dies mit dem Find-Befehl zu kombinieren?

Dank

Antwort

2

in meinem manpage Es gibt nichts über das Format des -ls Parameter ändern. Tatsächlich wird die Ausgabe von -ls auf meinem System nicht von verschiedenen Umgebungsvariablen beeinflusst, die sich auf die Ausgabe des Befehls ls selbst auswirken. Ich nehme an, dass das Format des -ls Parameters intern find ist und nicht den tatsächlichen ls Befehl enthält. Für mich ist das Programmieren sinnvoll. Warum einen externen Befehl ausführen? Simulieren Sie einfach die Anzeige.

Die einzige Möglichkeit, um dies zu umgehen, ist -exec oder -print0 zu verwenden, um die Ergebnisse an den tatsächlichen ls Befehl übergeben. Ein wenig Warnung: Wenn Sie den Namen des Verzeichnisses übergeben, wird ls den Inhalt dieses Verzeichnisses drucken, so müssen Sie -d an den Befehl ls übergeben oder -type f in Ihre find Abfrage hinzufügen. Ich habe die Hilfeseite finden auf Linux, und stellte fest, dass es die gleiche Leistung sein annimmt als , so I used that. Since -d is included, I didn't have to add Typ -f` meiner Entdeckung Abfrage -dils:

Dies wird die -exec mit der jeder sendet Datei oder Verzeichnis einzeln zum Befehl ls. Wenn Sie 10.000 Dateien haben, wird ls 10.000 Mal aufgerufen.

$ find /directory -xdev -exec ls -dils --time-style=long-iso {} \; 

Dies vielleicht effizienter:

$ find /directory -xdev -print0 | xargs -0 ls -dils --time-style=long-iso 

Dies wird Gruppe so viele Dateinamen wie möglich, die in den Befehlspuffer passen und sie sofort Befehl an die ls passieren. Es wird den Befehl ls so oft wie erforderlich aufrufen, um alle Dateien zu vervollständigen. Wenn Sie beispielsweise 10.000 Dateien in Ihrem find-Befehl haben, wird der Befehl ls möglicherweise ein- oder zweimal anstelle von 10.000 Mal aufgerufen.

Das Problem ist, dass xargs Probleme mit lustigen Dateinamen hat, und es gibt ein paar Sicherheitsaspekte, wie in der manpage wies darauf hin:

Es ist nicht möglich, xargs sicher verwendet werden, da es immer Eine Zeitlücke zwischen der Erstellung der Liste der Eingabedateien und ihrer Verwendung in den Befehlen, die XARGS ausgibt. Wenn andere Benutzer Zugriff auf das System haben, können sie das Dateisystem während dieses Zeitfensters manipulieren, um die Aktion der Befehle zu erzwingen, die xargs runs für nicht beabsichtigte Dateien anwenden.Für eine ausführlichere Erörterung dieser und damit zusammenhängender Probleme lesen Sie bitte das Kapitel "Sicherheitsüberlegungen" in den Textinfo-Dokumenten von findutils. Die Option -execdir von find kann oft als eine sicherere Alternative verwendet werden.

Der -print0 Parameter verwendet ein NUL Zeichen Dateinamen zu trennen anstelle ein NL und die -0 Parameter teilen xargs die NUL Zeichen als Dateinamen Separator zu verwenden, anstatt Leerzeichen (die Zeichen in der $IFS Umgebung Variable).

Dies bedeutet, funktioniert fast die ganze Zeit, aber Sie können immer noch entscheiden, dass -exec ls ist ein besserer Weg zu gehen.

+0

Xargs hat keine Probleme mit "lustige Dateinamen", wenn mit -0 verwendet. Eine andere Möglichkeit, ls effizient zu verwenden, ist die Verwendung von -exec ... +. In Bezug auf die Sicherheit macht der oben zitierte Punkt nur einen Unterschied, ob es sicherheitsrelevante Auswirkungen darauf gibt, ob und wie eine Datei in der Ausgabe von -ls oder ls auftaucht. –

3

Sie verschiedene Optionen verwenden können, um -printf (Mann finden)

find . -printf "%CY-%Cm-%Cd %CH:%CM\n" 
+0

Dang. Ich habe '-printf' in der GNU-Version von 'find' vergessen. Es gibt keinen '-printf'-Parameter auf anderen Unix-Systemen, also ist es nicht universell. Auf meinem Mac ist '-printf' nicht vorhanden. Wenn das OP jedoch '--time-style' in' ls' verwendet, hat er die GNU-Werkzeuge und '-printf' sollte funktionieren. –

+0

FWIW -printf kann die x -> y-Notation, die ls für symbolische Links verwendet, nicht simulieren. –

Verwandte Themen