awkとdateコマンドを一緒に試してください

awkとdateコマンドを一緒に試してください

ls -l今月、最後に変更されたファイルのみを使用してフィルタリングしたいと思います。実行中:ls -l | awk '{if($6 == date +%b) print$0;構文エラーが発生しました。

awkとスクリプトバッシングで引用符を正しく使用する方法に関する簡単なルールをインターネット全体で見つけましたが、わかりません。私のプログラミング経験にもかかわらず、私はこれが非常に混乱しているので、この特定の状況に対処する具体的な答えよりも、これらの質問に対する一般的な答えを歓迎します。

答え1

dateおそらく、コードでこれを何度も呼び出したくないでしょう。ランタイム中は「スケジュール」します。だから私たちはそれをプリセットして変数として渡すことができます

例えば

ls -l | awk -v month="$(date +%b)" '$6 == month { print }'

今月から始まったが1年以上経過したファイル(2015年8月から)、月名にスペースが含まれているロケールにある場合、またはファイル名に改行文字が含まれている場合、この操作は失敗します。 lsの出力を解析するにはリスクがあります。

答え2

次に、バリアントでこのループを試してみてください。今日の現在の月と年を保存し、シェルグロービング(*)を使用してファイルリスト(ls -lwillに似ていますがwillではありませんls -al)をインポートし、GNU提供statコマンドを使用して各ファイルの修正時間を取得し、月と年。月と年が現在の月と年と同じである場合は、ファイルに対してls -ld次のことを行います(この-dフラグは、$ fがディレクトリの場合に誤ってサブディレクトリが一覧表示されるのを防ぐためです)。

thisym=$(date +%Y-%m)
for f in *
do
  ym=$(stat -c %y -- "$f" | cut -d- -f1-2)
  if [ "$ym" = "$thisym" ]
  then
    ls -ld -- "$f"
  fi
done

関連情報