シェルスクリプトからファイルのアクセス日を抽出したいと思います。次のスクリプトを書いてみましたが、うまくいきません。私がエコーするとき訪問日、出力は「従業員」です。
file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)
答え1
これは職業ですstat
。
人間が読める形式で最後のアクセス時間を取得するには、次のようにします。
stat -c '%x' file.txt
エポックから経過した時間(秒):
stat -c '%X' file.txt
答え2
ls -lu
一般的な出力を見ると
-rw-r--r-- 1 someuser somegroup 74 Mar 29 05:21 filename
グループ名の前には合計5つの空白文字があることがわかります。したがって、コマンドで指定したフィールド6は、グループcut
(あなたの場合は「staff」)を返します。
また、訪問日は表記上6番ではなく7番フィールドになります。
1つの解決策はを使用することですawk
。これは、デフォルトでフィールド区切り文字の複数の発生を処理するためです。
accessday=$(ls -lu $file | awk '{print $7}')
答え3
あなたの質問に従ってstatを使用して出力を正規化し、希望の日付のみを表示するように切り捨てます。
stat -c '%x' FILENAME | cut -c 9,10
答え4
ls
次の出力を解析します。難しく、常に可能ではない。これはタイムスタンプを抽出したい場合に必要な代替方法ですが、(唯一の移植可能な方法:すべてのシステムにコマンドがあるわけではありませんstat
)、人間が読めるタイムスタンプを取得します。機械が読める形式に変換するのが難しい。少なくとも難しい部分を修正してください。ユーザーとグループのフィールドを省略する転送-o
と-g
オプション(一部のシステムでは、これらのフィールドにスペースが含まれているため、出力では区別できない可能性がありますls
)。その後、タイムスタンプはフィールド4-6(1から始まり番号付き)を占めます。
access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')
その月の日付が必要な場合は、過去6ヶ月以内のタイムスタンプであるかどうかに応じて、2つの出力形式を区別する必要があります。安定した出力フォーマットのためにロケールをCに設定します。この形式では、その月の日付は常に2番目のタイムスタンプフィールドです。
access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')