Suchen Sie in csh unter SunOS nach Dateien, die nach einer bestimmten Zeit erstellt wurden

Suchen Sie in csh unter SunOS nach Dateien, die nach einer bestimmten Zeit erstellt wurden

Auf meinem SunOS-System versuche ich, mit , , und alle Dateien zu finden, die nach 19:00 Uhr erstellt wurden csh.lsawk

ls -l  "${Source_files_Dir}"/*.zip| awk -v today="$(date "+%b %d")" '{
date=$6" "$7; time=$8; if (date == today && substr(time,1,2) >= 19)
print $9 }'|xargs -n 1 basename

Dieser Befehl funktioniert in , kshaber nicht in csh. Wie kann ich dies in erreichen csh?

Hinweis: Die Option wird unter SunOS -newermtnicht unterstützt , daher habe ich versucht, den obigen Befehl zu verwenden.findls

Antwort1

Dieser Ansatz ist ohnehin ziemlich unzuverlässig. Sie sollten besser Folgendes verwenden perl:

perl -MPOSIX -MFile::Basename -le '@start = localtime; @start[0..2] = (0,0,19); $start = mktime(@start); for (@ARGV) {print basename$_ if @s = stat$_ and $s[9] >= $start}' -- "$Source_files_Dir"/*.zip

Ich bin mir nicht sicher, warum Sie in diesem Jahrhundert csh verwenden würden, aber beachten Sie, dass das Obige nicht richtig funktioniert, cshwenn $Source_files_Dires Zeilenumbruchzeichen enthält. Das Ersetzen "$Source_files"durch $Source_files:qwäre in csh besser (funktioniert aber in anderen Shells nicht mehr).

Solaris (früher als SunOS bekannt) ist normalerweise auch zshinstalliert. Sie müssen lediglich Folgendes tun:

autoload age
print -rC1 -- $Source_files_Dir/*.zip(Ne[age 19:00]:t)

Auflistung einiger der Probleme mit Ihrem Ansatz:

  • ls -l "${Source_files_Dir}"/*.zip: Wenn $Source_files_Dires mit beginnt -, wird es von als Option behandelt ls. Im Allgemeinen müssen Sie --das Ende von Optionen markieren, wenn das Folgende variabel ist.
  • Wenn eine der Zip-Dateien vom Typ „Verzeichnis“ ist, wird ihr Inhalt aufgelistet. Bei der Verwendung lsmit einem Glob oder allgemein variablen Daten möchten Sie im Allgemeinen die -dOption verwenden:ls -ld -- ...
  • Insbesondere in csh $Source_files_Dirführt es zu einem Syntaxfehler, wenn es Zeilenumbruchzeichen enthält. $Source_files_Dir:qist in csh besser, wie oben erwähnt.
  • In jedem Fall gehen Sie davon aus, dass die Dateipfade (Dateinamen und symbolische Linkziele, die ls -lebenfalls gemeldet werden) keine Zeilenumbruchzeichen enthalten, da Sie die Ausgabe lszeilenbasiert verarbeiten.
  • Sie gehen davon aus, dass Datum/Uhrzeit in den Feldern 6, 7 und 8 stehen, was nicht funktioniert, wenn Benutzer- oder Gruppennamen Leerzeichen enthalten. Die Verwendung -nanstelle von (oder zusätzlich zu) -lzum Abrufen numerischer UIDs/GIDs würde es robuster machen (und die möglicherweise kostspielige Übersetzung in Namen vermeiden).
  • date +%dgibt eine mit Nullen aufgefüllte Zahl aus, während bei vielen lsImplementierungen und in vielen Gebietsschemas (und das ist eine POSIX-Anforderung im C/POSIX-Gebietsschema) ls -leine mit Leerzeichen aufgefüllte Zahl ( date +%e) ausgegeben wird.
  • ls -lAusgaben Mon dd HH:MMfür aktuelle Daten, nicht für zukünftige, aber Mon dd YYYYfür andere, die Ihr Ansatz nicht verarbeitet.
  • Ohne diese -LOption wird bei symbolischen Links die Änderungszeit des symbolischen Links und nicht die der ZIP-Datei aufgelistet, auf die er verweist. perl's stat()oder zsh's agearbeiten mit der Mtime des Ziels.
  • bei Ihrem {print $9}gehen Sie davon aus, dass nicht nur die Benutzer-/Gruppennamen keine Leerzeichen enthalten, sondern auch die Dateipfade keine.
  • Die Verwendung xargsdieser Rohausgabe schlägt fehl, wenn die Dateipfade Backslashs oder Anführungszeichen enthalten und wenn das Programm nicht im Gebietsschema C ausgeführt wird, bei Dateinamen, die nicht aus in der Kodierung des Gebietsschemas kodiertem Text bestehen.
  • Wenn sich im Verzeichnis keine nicht ausgeblendete ZIP-Datei befindet, erhalten Sie in csh eine No matchFehlermeldung, und lsdie Ausführung erfolgt nicht (was zumindest besser ist als das Verhalten im Bourne-Stil, bei dem lswörtlich mit dem Muster aufgerufen wird). Die xargsAusführung erfolgt jedoch trotzdem und basenamezwar einmal ohne Argument, was wahrscheinlich zu einem verwirrenden Fehler führt.

Antwort2

Ich habe eine Antwort für csh bekommen, anstatt das heutige Datum in einer Variablen zu speichern, '$'anstatt es abzurufen .backtickstodayawk

set today=`date "+%b %d"`
ls -l "$Source_files_Dir"/*.zip | awk -v today="$today" ' \
{ \
    date=$6" "$7; \
    time=$8; \
    if (date == today && substr(time,1,2) >= 19) print $9; \
}'|xargs -n 1 basename

verwandte Informationen