変更された日付に基づくやや複雑なtar

変更された日付に基づくやや複雑なtar

まあ、私はそれが可能だと思いますが、よく理解されていません。これがその場合です。

1つのフォルダには、私のボットのすべてのプロセスのログファイルが含まれています。構造は少し次のとおりです。

$ ls -lrt
total 8
drwxrwxr-x 2 per per 4096 nov  3 12:46 launch01
-rw-rw-r-- 1 per per    0 nov  3 12:47 camera112.log
-rw-rw-r-- 1 per per    0 nov  3 12:47 motors121.log
-rw-rw-r-- 1 per per    0 nov  3 12:47 lidar111.log
drwxrwxr-x 2 per per 4096 nov  3 12:49 launch02
-rw-rw-r-- 1 per per    0 nov  3 12:49 motors122.log
-rw-rw-r-- 1 per per    0 nov  3 12:49 lidar211.log
-rw-rw-r-- 1 per per    0 nov  3 12:49 camera113.log

ファイルcamera112.logとログはフォルダmotors121.logに関連付けられています。特定のブートに属するすべてのファイルをインポートし、tarballにパッケージ化するスクリプトを作成したいと思います。タイムスタンプはファイルごとに少しずつ異なる場合があり、ファイルの数はほとんど関連性がないため、すべての関連ファイルを収集する最善の方法は、以下のすべてのファイル(含む)を次のファイルまでインポートすることだと思いました。リストのディレクトリ(除外)タイムスタンプと名前と同様に、ファイルも異なる場合があります。一貫したものは、フォルダ、ファイルの束、次のフォルダ、ファイルなどです。最終的に最新のログセットを簡単に入手したいと思います。lidar111.loglaunch01launch01

ここでのアプローチは不明です。この問題を解決する方法についてのアイデアはありますか?

言う:

  • ファイル数量は異なる場合があります。
  • 正確なタイムスタンプは信頼できませんが(前述のようにフォルダは異なりますlaunch01camera112.log、相対タイムスタンプはうまく機能します。たとえば、提供されているリストの(含まれている)から(含まれていない)まですべてのファイルをパッケージ化できますlaunch01launch02ls -lrt

答え1

入力を使用してタスクを塊に分割します。

drwxrwxr-x 2 per per 4096 nov  3 12:46 launch01
-rw-rw-r-- 1 per per    0 nov  3 12:47 camera112.log
-rw-rw-r-- 1 per per    0 nov  3 12:47 motors121.log
-rw-rw-r-- 1 per per    0 nov  3 12:47 lidar111.log
drwxrwxr-x 2 per per 4096 nov  3 12:49 launch02
-rw-rw-r-- 1 per per    0 nov  3 12:49 motors122.log
-rw-rw-r-- 1 per per    0 nov  3 12:49 lidar211.log
-rw-rw-r-- 1 per per    0 nov  3 12:49 camera113.log

ファイル名の「ソートされた」リストのみを生成

次のいずれかを使用します。

ls -lrt | tr -s ' ' | cut -d' ' -f9
ls -lrt | awk '{print $9}'

以下を提供します。

launch01
camera112.log
motors121.log
lidar111.log
launch02
motors122.log
lidar211.log
camera113.log

リストを複数の部分に分割する

これを修正してください回答到着区切り文字に基づいて1つのファイルを複数のファイルに分割するawk_pattern、次の内容で名前付きファイルを作成します。

BEGIN{ fn = "part1.txt"; n = 1 }
{
   if (substr($0,1,6) == "launch") {
       close (fn)
       n++
       fn = "part" n ".txt"
   }
   print > fn
}

その後実行

ls -lrt | awk '{print $9}' | awk -f awk_pattern

希望の出力を提供します。

part1.txt

launch01

それから

part2.txt

launch01
camera112.log
motors121.log
lidar111.log

part3.txt

launch02
motors122.log
lidar211.log
camera113.log

最初のファイル(part1.txt)には1行しか含まれていないため削除する必要がありますが...

rm part1.txt

tar の各部分の内容

~から6.3 ファイルから名前を読む

tar -c -v -z -T part2.txt -f part2.tgz

tarファイルを繰り返します。

for part_file in $(ls part*)
do
  tar_file = ${part_file%.*}
#  tar_file = basename ${part_file} .txt
  tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done

これは与えなければならない

part1.tgz
part2.tgz
part3.tgz

もう一度part1.tgz削除する必要があります。

rm part1.tgz

それらを一つにまとめる

#!/bin/bash

ls -lrt | awk '{print $9}' | awk -f awk_pattern

for part_file in $(ls part*)
do
  tar_file = ${part_file%.*}
  tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done


rm part1.txt
rm part1.tgz

スクリプトとして(awkモードを含む)

#!/bin/bash

ls -lrt | awk '{print $9}' | awk 'BEGIN{ fn = "part1.txt"; n = 1 }
{
   if (substr($0,1,6) == "launch") {
       close (fn)
       n++
       fn = "part" n ".txt"
   }
   print > fn
}'

for part_file in $(ls part*)
do
  tar_file = ${part_file%.*}
  tar -c -v -z -T ${part_file} -f ${tar_file}.tgz
done

rm part1.txt
rm part1.tgz

これは(希望的に)しなければならない圧縮するファイルがなかったので、最初の2つのステップ、つまりtar部分までテストしましたが、うまくいきます。


可能な改善点:

  1. 後処理part*.txtファイル削除(rm part*.txt

  2. 後処理:圧縮後のログファイルの削除(rm *.log

  3. 後処理:圧縮後のディレクトリの削除(rm -R -- */

    これを見て回答到着ディレクトリからすべてのサブディレクトリを削除する方法は?

  4. part1.txtawkが無駄なファイルを生成するのを防ぐ

  5. tarファイルを別の場所に保存します(... -f ${tar_path}/${tar_file}.tgz)。

  6. 中間ファイルを使用しないでくださいpart*.txt

関連情報