3

ディレクトリ内とその下のすべてのファイルを列挙するスクリプトを作成しました。pv は通常ルート ディレクトリから使用するため、pv を使用して進行状況のフィードバックを追加したかったのです。

問題は、時間出力 (%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 つの一時ファイルのみを使用することです。ソートのみが個別に行われます。

4

2 に答える 2

3

フィールド精度指定子を使用して、引数内の秒を切り捨てることができ-printfます (少なくとも GNU find4.4.2 を使用):

find -printf "%11s %TY-%Tm-%Td %.8TT %p\n"

これにより、「HH:MM:SS」の 8 文字が残ります。

私の答えの残りはおそらく無意味です:

#1-5が機能しない理由は、の出力にwcファイル名(特にスペース)が含まれているためです。スペースにより、コマンドpvからのファイル名が入力ファイルとして認識されます。wcコマンド ライン引数は、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
于 2011-01-25T07:32:32.653 に答える
0

これが単なるおもちゃではなく、実際に機能するツールである場合は、「進捗状況のフィードバック」をまとめて削除します...おそらく、あなたの生活を複雑にしないときに戻ってくるでしょう. それまでの間、スクリプトが返されるのを待つよりも、フィードバックを提供する方法を理解するために多くの時間を費やしたことでしょう。

何らかのフィードバックを絶対に提供する必要がある場合は、「Sorting wc -l $TMPFILElines ...」とエコーしてください。

経験から、非常に多くの行をソートするのにどれくらいの時間がかかるかを感じることができます.

息子にキスして、キスして。

于 2011-01-25T02:34:27.293 に答える