csh
ls
私の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()
ターゲットのリアルタイムで使用されますzsh
。age
- あなたの場合、
{print $9}
スペースを含まないユーザー/グループ名に加えて、ファイルパスにスペースが含まれていないとします。 xargs
ファイルパスにバックスラッシュまたは引用符が含まれていて、Cロケールで実行されていない場合は、ロケールエンコードでテキストとしてエンコードされていないファイル名にこのネイティブ出力を使用すると失敗します。- ディレクトリに非表示のzipファイルがない場合、cshでエラーが発生して
No match
実行ls
されませんが(少なくともls
リテラルモードを使用するBourneスタイルの呼び出しよりも優れた動作です)、xargs
実行されbasename
続けます。引数なしで実行一度実行すると、混乱したエラーが発生する可能性があります。
答え2
.'$'
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