ディレクトリ内のすべてのファイルを列挙するためのスクリプトを作成しました。 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つの一時ファイルのみを使用することです。ソートのみが別々に行われます。
swap 'pv'と' colrm'(あなたの "one pass"コマンドと同じ順序を使います) – jfs