
Auf meinem SunOS-System versuche ich, mit , , und alle Dateien zu finden, die nach 19:00 Uhr erstellt wurden csh
.ls
awk
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 , ksh
aber nicht in csh
. Wie kann ich dies in erreichen csh
?
Hinweis: Die Option wird unter SunOS -newermt
nicht unterstützt , daher habe ich versucht, den obigen Befehl zu verwenden.find
ls
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, csh
wenn $Source_files_Dir
es Zeilenumbruchzeichen enthält. Das Ersetzen "$Source_files"
durch $Source_files:q
wäre in csh besser (funktioniert aber in anderen Shells nicht mehr).
Solaris (früher als SunOS bekannt) ist normalerweise auch zsh
installiert. 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_Dir
es mit beginnt-
, wird es von als Option behandeltls
. 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
ls
mit einem Glob oder allgemein variablen Daten möchten Sie im Allgemeinen die-d
Option verwenden:ls -ld -- ...
- Insbesondere in csh
$Source_files_Dir
führt es zu einem Syntaxfehler, wenn es Zeilenumbruchzeichen enthält.$Source_files_Dir:q
ist in csh besser, wie oben erwähnt. - In jedem Fall gehen Sie davon aus, dass die Dateipfade (Dateinamen und symbolische Linkziele, die
ls -l
ebenfalls gemeldet werden) keine Zeilenumbruchzeichen enthalten, da Sie die Ausgabels
zeilenbasiert 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
-n
anstelle von (oder zusätzlich zu)-l
zum Abrufen numerischer UIDs/GIDs würde es robuster machen (und die möglicherweise kostspielige Übersetzung in Namen vermeiden). date +%d
gibt eine mit Nullen aufgefüllte Zahl aus, während bei vielenls
Implementierungen und in vielen Gebietsschemas (und das ist eine POSIX-Anforderung im C/POSIX-Gebietsschema)ls -l
eine mit Leerzeichen aufgefüllte Zahl (date +%e
) ausgegeben wird.ls -l
AusgabenMon dd HH:MM
für aktuelle Daten, nicht für zukünftige, aberMon dd YYYY
für andere, die Ihr Ansatz nicht verarbeitet.- Ohne diese
-L
Option wird bei symbolischen Links die Änderungszeit des symbolischen Links und nicht die der ZIP-Datei aufgelistet, auf die er verweist.perl
'sstat()
oderzsh
'sage
arbeiten 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
xargs
dieser 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 match
Fehlermeldung, undls
die Ausführung erfolgt nicht (was zumindest besser ist als das Verhalten im Bourne-Stil, bei demls
wörtlich mit dem Muster aufgerufen wird). Diexargs
Ausführung erfolgt jedoch trotzdem undbasename
zwar 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 .backticks
today
awk
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