ディレクトリ内とその下のすべてのファイルを列挙するスクリプトを作成しました。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 つの一時ファイルのみを使用することです。ソートのみが個別に行われます。