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.
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...