3

出力から日付部分のみを切り取ろうとしていls -lrth | grep TRACKます:

-rw-r--r-- 1 ins ins   0 Dec  3 00:00 TRACK_1_20121203_01010014.LOG
-rw-r--r-- 1 ins ins   0 Dec  3 00:00 TRACK_0_20121203_01010014.LOG
-rw-r--r-- 1 ins ins   0 Dec 13 15:10 TRACK_9_20121213_01010014.LOG
-rw-r--r-- 1 ins ins   0 Dec 13 15:10 TRACK_8_20121213_01010014.LOG

しかし、これを行う:

ls -lrth | grep TRACK | tr "\t" " " | cut -d" " -f 9                 

2桁の日付と1桁のスペースのみが表示されます:

13
13

だから私はコマンドで何かを試して、trすべての1桁の日付を2桁に変換しました:

ls -lrth | grep TRACK | tr "\t" " " | tr "[1-9]" "['01'-'09']" |  cut -d" " -f 9

しかし、それはいくつかの奇妙な結果をもたらしており、明らかに私の目的には役立っていません。正しい出力を取得する方法についてのアイデアはありますか?

4

6 に答える 6

6

ls出力を解析しません。

lsファイル情報をインタラクティブに見るためのツールです。その出力は人間用にフォーマットされており、スクリプトでバグを引き起こします。代わりにglobsまたはを使用してください。find理由を理解してください: http://mywiki.wooledge.org/ParsingLs

私はこの方法をお勧めします:

日付とファイルパスが必要な場合:

find . -name 'TRACK*' -printf '%a %p\n'

日付のみが必要な場合:

find . -name 'TRACK*' -printf '%a\n'
于 2012-12-16T12:18:30.593 に答える
4

次のような別のアプローチを試すことができます

find . -name 'TRACK*' -exec stat -c %y {} \; | sort

| cut -f1 -d' '日付だけが必要な場合は、次のようなものを追加できます。

于 2012-12-16T11:10:00.863 に答える
2

これで十分だと思います:

ls -lhrt | grep TRACK | awk '{print $6, $7, $8}'
于 2012-12-16T11:07:45.897 に答える
1

すでに述べたように、ls!の出力を解析しないでください。

変更時間のみが必要なため、コマンドdateにはそのための優れたオプションがあります: option -r(man date詳細情報)。

したがって、おそらく行の代わりにこれが必要です。

for i in TRACK*; do date -r "$i"; done

日付の形式をどのようにしたいのかわからないので、オプションを試してください。

for i in TRACK*; do date -r "$i" "+%D"; done

(形式は にありますman date)。

于 2012-12-16T18:43:36.353 に答える
1

その種の置換は、次の方法でより適切に処理できますsed

ls -lrth | grep TRACK | sed 's/ \+/ /g;s/ \([0-9]\) / 0\1 /g' | cut -d" " -f 7
于 2012-12-16T12:21:03.140 に答える
0

statファイルに関する情報を取得するために使用します。

また、tr1 対 1 の文字変換のみを行います。1 文字のシーケンスを 2 文字のシーケンスに置き換えることはありません。

于 2012-12-16T18:47:51.043 に答える