Anzeige Dateinamen und "nur" letzte Änderungszeit?!

S

steakley

Grünschnabel
Hallo, ihr Cracks,

ich bastle gerade an einem Script und komme nicht weiter. Ich möchte in eine Datei die Files eines Verzeichnisses pipen. Hinter dem Dateinamen soll aber noch die letzte Änderungszeit erscheint, und zwar nur die (also Datum und Zeit). Die anderen Informationenn, wie Größe etc. möchte ich nicht in der Datei sehen. Ich benutze HP-UX und die bash-Shell. Kann mir jemand einen Tipp geben?!

Viele Grüße,
steakley
 
also das sollte man bereits mit einer kombination aus ls und awk hinbekommen.


also mini-crashkurs awk: awk ließt zeile für zeile einer datei (oder von stdin) ein und 'splittet' die ausgabe in felder, nämlich in spalten. spalte eins ist dann in der variable "$1", die spalte 2 in "$2" etc. die komplette zeile steckt in "$0". wobei die spalten per default durch leerzeichen getrennt sind.
Code:
ls -l /bin
gibt bei mir sowas aus: (auszug)
Code:
-rwxr-xr-x 1 root root  701680 2007-10-05 16:37 bash*
-rwxr-xr-x 1 root root   25448 2007-10-05 15:41 bunzip2*
-rwxr-xr-x 1 root root   25448 2007-10-05 15:41 bzcat*
lrwxrwxrwx 1 root root       6 2008-01-27 02:11 bzcmp -> bzdiff*
-rwxr-xr-x 1 root root    2128 2007-10-05 15:41 bzdiff*
also befindet sich das änderungsdatum in den spalten 6 und 7.
Code:
ls -l /bin|awk '{print $6, $7}'
gibt also nur das änderungsdatum an. (in den meisten zeilen, in der ersten zeile ("total 161332") zb nicht. aber da ist ja auch keine datei drin...)

wenn du jetzt nur "normale" dateien haben willst, könntest du das mit dem überprüfen des jeweils ersten zeichens in der zeile tun: ist es ein "-" ist es eine normale datei, ist es ein "l" ein link, ist es ein "d" ein directory etc.
Code:
ls -l /bin|awk '{if ($0 ~ /^-/) {print $6, $7}}'
wobei ich mir nicht sicher bin, obs da nicht vielleicht ausnahmen gibt.

deswegen kannst du einfach mit find nach dateien in einem verzeichnis suchen:
Code:
find /bin -type f -exec ls -l {} \;
type f steht für "type file", imho selbsterklärend. das exec kann verwendet werden, um auf die gefundenen dateien befehle anzuwenden. wobei die aktuelle datei mit "{}" repräsentiert wird. der exec befehl wird mit einem semicolon terminiert, welches wir hier mit einem backslash escapen müssen, damit die shell (hier also die bash) es nicht interpretiert... (ist ja in der bash der kommandoseparator...)
den find befehl kannst du dann natürlich direkt in awk pipen, aber eine schleife ist imho sinnvoller:
Code:
touch outputFile
for file in $(find /bin -type f -exec echo "{}" \;); do
   changeDate="$(ls -l "$file"|awk '{print $6, $7}')"
   echo "$file $changeDate" >> outputFile
done
das funktioniert allerdings nur, wenn keine leerzeichen im dateinamen vorkommen...
 
Puuuh, Hammer! Vielen Dank für die awk-Einführung und die Mühe, die du dir gemacht hast :o). Werde es jetzt mal nach und nach durchgehen und "verstehen" und testen.

DANKE jedenfalls!
 

Ähnliche Themen

Welches Linux/Unix für ehemaligen OSX Nutzer?

fedora 17 problem mit init script

Letzten Tag löschen

Last mit etc/passwd anzeigen lassen

zwei Sambaserver binden

Zurück
Oben