SunOSのcshで特定の時間以降に生成されたファイルを見つける

SunOSのcshで特定の時間以降に生成されたファイルを見つける

cshls私のSunOSシステムで、およびを使用して午後7時以降に生成されたすべてのファイルを見つけようとしました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

このコマンドは動作しますがksh動作しませんcsh。どうすればいいですかcsh

-newermt注:このオプションはSunOSではサポートされていないため、find上記のコマンドを試しましたls

答え1

とにかくこのアプローチは非常に不安定なので、次のことをお勧めします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

今世紀になぜcshを使用するのかわかりませんが、改行文字が含まれているcsh場合は$Source_files_Dir上記が正しく機能しないことに注意してください。 cshを"$Source_files"withに置き換える方$Source_files:qが良いでしょう(しかし、もはや他のシェルでは機能しません)。

通常、Solaris(以前のSunOS)zshもインストールされます。以下を行います。

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

アプローチのいくつかの問題をリストします。

  • ls -l "${Source_files_Dir}"/*.zip$Source_files_Dir:で始まると、-オプションとして扱われますls。一般的に言えば、次の内容がVariableの場合は--オプションの終わりを表示する必要があります。
  • zipファイルがディレクトリタイプの場合、その内容が一覧表示されます。ls通常、globまたは変更可能なデータを扱う場合は、通常、次の-dオプションを使用することをお勧めします。ls -ld -- ...
  • 特に、csh に$Source_files_Dir改行文字を含めると構文エラーが発生します。$Source_files_Dir:q上記のように、cshはより良いです。
  • いずれにせよ、行ベースの出力を処理するときに、ファイルパス(報告されls -lたファイル名とシンボリックリンクターゲットも含む)に改行が含まれていないとします。ls
  • 日付/時刻がフィールド6、7、8にあるとします。ユーザー名またはグループ名にスペースがあると、競合が発生します。数値 uid/gid を取得する代わりに-n(または追加で)を使用すると、-lより強力になります(そして潜在的に高価な名前変換を避けることができます)。
  • date +%dゼロで埋められた数字または多くの実装とls多くのロケール(C / POSIXロケールのPOSIX要件)の場合は、スペース()ls -lで埋められた数字を出力します。date +%e
  • ls -l最新の日付の出力は、Mon dd HH:MM将来の日付ではなく、Mon dd YYYYメソッドが処理できない他の日付の出力です。
  • この-Lオプションがないと、シンボリックリンクの場合、シンボリックリンクが指すzipファイルの変更時間ではなく、シンボリックリンクの変更時間が一覧表示されます。perlまたはstat()ターゲットのリアルタイムで使用されますzshage
  • あなたの場合、{print $9}スペースを含まないユーザー/グループ名に加えて、ファイルパスにスペースが含まれていないとします。
  • xargsファイルパスにバックスラッシュまたは引用符が含まれていて、Cロケールで実行されていない場合は、ロケールエンコードでテキストとしてエンコードされていないファイル名にこのネイティブ出力を使用すると失敗します。
  • ディレクトリに非表示のzipファイルがない場合、cshでエラーが発生してNo match実行lsされませんが(少なくともlsリテラルモードを使用するBourneスタイルの呼び出しよりも優れた動作です)、xargs実行されbasename続けます。引数なしで実行一度実行すると、混乱したエラーが発生する可能性があります。

答え2

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

関連情報