2011-01-25 5 views
3

ディレクトリ内のすべてのファイルを列挙するためのスクリプトを作成しました。 pvを使っていくつかのプログレッションフィードバックを追加したかったのですが、通常はルートディレクトリから使用しています。cut、colrm、awk、sedの奇妙な問題:パイプストリームから文字をカットできない

問題は、時間の出力(%TT)に常に小数点以下の秒数を含むfindですが、詳細を記録したくありません。

すべてのことを1回のパスで行うスクリプトを作成すると、適切な出力が得られます。しかし、中間ファイルを使用して「2回目」のパスを見積もった場合、その結果は変わり、なぜ私は見えません。

#!/bin/bash 

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 2> /dev/null | 
# - Remove the fractional seconds from the time 
# before:  4096 2011-01-19 22:43:51.0000000000 . 
# after :  4096 2011-01-19 22:43:51 . 
colrm 32 42 | 
pv -ltrbN "Enumerating files..." | 
# - Sort every thing by filename 
sort -k 4 

しかし、ソートは長い時間がかかる場合がありますので、私はこのような何かを試してみましたが、もう少しフィード・バックを持っている:

#!/bin/bash 

TMPFILE1=$(mktemp) 
TMPFILE2=$(mktemp) 

# Erase temporary files before quitting 
trap "rm $TMPFILE1 $TMPFILE2" EXIT 

find -printf "%11s %TY-%Tm-%Td %TT %p\n" 2> /dev/null | 
pv -ltrbN "Enumerating files..." > $TMPFILE1 
LINE_COUNT="$(wc -l $TMPFILE1)" 

#cat $TMPFILE1 | colrm 32 42 |     #1 
#cat $TMPFILE1 | cut -c1-31,43- |    #2 
#cut -c1-31,43- $TMPFILE1 |      #3 
#sed s/.0000000000// $TMPFILE1 |     #4 
awk -F".0000000000" '{print $1 $2}' $TMPFILE1 | #5 
pv -lN "Removing fractional seconds..." -s $LINE_COUNT > $TMPFILE2 

echo "Sorting list by filenames..." >&2 
cat $TMPFILE2 | 
sort -k 4 

このバージョンでは、正しい結果が得られ5つの「ソリューション」のどれも動作しません。 ".0000000000"の部分は出力に残されます。

誰かが理由を説明できますか?

私の最終的な解決策は、切断操作を検索と組み合わせて、1つの一時ファイルのみを使用することです。ソートのみが別々に行われます。

+0

swap 'pv'と' colrm'(あなたの "one pass"コマンドと同じ順序を使います) – jfs

答えて

3

あなたは(少なくともGNU find 4.4.2を使用して)フィールド精度指定子を使用して-printfに引数内秒を切り捨てることができます。

「HH:MM:SS」の8つの文字を残し
find -printf "%11s %TY-%Tm-%Td %.8TT %p\n" 

私の答えの残りの部分は、おそらく議論の余地がある:

あなたの#1-5が動作しない理由はwcの出力は、ファイル名(特にスペース)を含むことです。このスペースにより、pvwcコマンドのファイル名を入力ファイルとして認識します。コマンドライン引数の方がstdinよりも優先されます。パイプを介して渡される入力ファイルと同じになるので、出力ファイルは未処理の入力ファイルのように見えます(パイプラインは無視されるためです)。ファイル名なしでのみ、カウントをキャプチャする

:ここ

LINE_COUNT=$(wc -l < "$TMPFILE1") 

は、いくつかのマイナーな改良点です:

< $TMPFILE1 colrm 32 42 |     #1 No need for cat 

または

colrm 32 42 < $TMPFILE1 |     #1 

< $TMPFILE1 cut -c1-31,43- |    #2 

または

cut -c1-31,43- < $TMPFILE1 |    #2 

sed s/\.0000000000// $TMPFILE1 |   #4 The dot should be escaped 
+0

Gosh!私はそれが私が逃したばかげた何かであることを知っていた。私は完全にwcを見過ごした。 %T.8Tのおかげで、すべてのことが簡単になります。 – PRouleau

0

おもちゃだけでなく、実際の作業ツールならば、私はちょうどあなたの人生を複雑にしていないときにそれを復活させるかもしれない。それまでの間は、あなたのスクリプトが復帰するのを待っていたよりも、フィードバックを与える方法を見つけようともっと多くの時間を費やしたでしょう。

あなたは絶対にだけ エコー、フィードバックのいくつかの並べ替えを与える必要がある場合は、「wc -l $TMPFILE行のソート...」

あなたはそれが経験からそう-多くの行をソートする取るよどのくらいのための感覚を得ることができます。

私の息子にキスして、キスしてください。