まあ、私はそれが可能だと思いますが、よく理解されていません。これがその場合です。
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.log
launch01
launch01
ここでのアプローチは不明です。この問題を解決する方法についてのアイデアはありますか?
言う:
- ファイル数量は異なる場合があります。
- 正確なタイムスタンプは信頼できませんが(前述のようにフォルダは異なります
launch01
)camera112.log
、相対タイムスタンプはうまく機能します。たとえば、提供されているリストの(含まれている)から(含まれていない)まですべてのファイルをパッケージ化できますlaunch01
。launch02
ls -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 の各部分の内容
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部分までテストしましたが、うまくいきます。
可能な改善点:
後処理:
part*.txt
ファイル削除(rm part*.txt
)後処理:圧縮後のログファイルの削除(
rm *.log
)後処理:圧縮後のディレクトリの削除(
rm -R -- */
)これを見て回答到着ディレクトリからすべてのサブディレクトリを削除する方法は?。
part1.txt
awkが無駄なファイルを生成するのを防ぐtarファイルを別の場所に保存します(
... -f ${tar_path}/${tar_file}.tgz
)。中間ファイルを使用しないでください
part*.txt
。