web-dev-qa-db-ja.com

xargsとgunzipでソート順を維持する方法

一部のファイルの内容をアルファベット順(この場合は日付と反復も意味します)で抽出しようとしています。最初にlsを使用してプロセスをテストします。

$ find /opt/minecraft/wonders/logs/ -name 20* -type f -mtime -3 -print0 \
   | sort | xargs -r0 ls -l | awk -F' ' '{print $6 " " $7 " " $9}'

私は肯定的な結果を得る:

Aug 18 /opt/minecraft/wonders/logs/2018-08-17-3.log.gz
Aug 18 /opt/minecraft/wonders/logs/2018-08-18-1.log.gz
Aug 19 /opt/minecraft/wonders/logs/2018-08-18-2.log.gz
Aug 19 /opt/minecraft/wonders/logs/2018-08-19-1.log.gz
Aug 20 /opt/minecraft/wonders/logs/2018-08-19-2.log.gz
Aug 20 /opt/minecraft/wonders/logs/2018-08-20-1.log.gz

ただし、実際にファイルを抽出しようとすると、並べ替え順序が失われます。

$ find /opt/minecraft/wonders/logs/ -name 20* -type f -mtime -3 -print0 \
   | sort | xargs -r0 gunzip -vc | grep "\/opt.*"`

/opt/minecraft/wonders/logs/2018-08-18-1.log.gz:     66.8%
/opt/minecraft/wonders/logs/2018-08-18-2.log.gz:     83.1%
/opt/minecraft/wonders/logs/2018-08-19-1.log.gz:     70.3%
/opt/minecraft/wonders/logs/2018-08-19-2.log.gz:     72.9%
/opt/minecraft/wonders/logs/2018-08-20-1.log.gz:     73.3%
/opt/minecraft/wonders/logs/2018-08-17-3.log.gz:     90.2%

これらのファイルを解凍するときに、並べ替え順序を維持するにはどうすればよいですか?

3
Jesse Yishai

find-print0オプションを使用し、xargs-0を使用しましたが、sort-zを使用するのを忘れました。したがって、sortには基本的に1行が表示されます(ファイル名に\nが含まれている場合を除く)。 lsで表示される出力は、おそらくlsが何らかの並べ替えを行っています。

find /opt/minecraft/wonders/logs/ -name '20*' -type f -mtime -3 -print0 |
  sort -z | xargs -r0 gunzip -vc | grep /opt

(注:20*はグロブであり、シェルでは引用符で囲む必要があるため、文字通りfindに渡されます。/grepでエスケープする必要はありません。 、それが何をするかは指定されていません。一致する行を印刷するだけの場合は、正規表現の最後に.*は必要ありません)

7
muru