開発ニーズ
/home/myself/src-logs/
In はkafka-logs の TOPIC の SegmentLog であり、異なるサフィックスを持つ.log
複数の.timeindex
ログ ファイルが含まれます。
すべてのファイルをダンプし、結果を他のファイルに 1 つずつ書き込むためkafka-dump-log.sh
に使用する必要があります。.log
ChatGPT 実装プロセス
質問をする
シェルでスクリプトを作成します。フォルダー内のサフィックス .log を持つすべてのファイルをトラバースし、sh /opt/kafka/bin/kafka-dump-log.sh --files /home/myself/src-logs/{traverse を実行します。 --print-data-log > /home/myself/dump-logs/{ファイル名}.log このコマンド。
ChatGPT の回答
以下は、指定されたディレクトリ内の接尾辞 .log を持つすべてのファイルをトラバースし、指定されたコマンドを実行できる利用可能なシェル スクリプトです。
#!/bin/bash
# 指定遍历的目录
dir="/home/myself/src-logs"
# 如果目录不存在或不是目录,则输出错误信息并退出
if [ ! -d "$dir" ]; then
echo "Error: $dir is not a directory"
exit 1
fi
# 遍历目录找到所有后缀为 .log 的文件,并执行给定的命令
for file in "$dir"/*.log; do
if [ -f "$file" ]; then
sh /opt/kafka/bin/kafka-dump-log.sh --files "$file" --print-data-log > "/home/myself/dump-logs/${file##*/}"
fi
done
説明します:
#!
行は、スクリプトに使用するインタープリターを指定します。ここでは bash が使用されます。dir
トラバースするディレクトリ パスを指定する変数。if
ステートメントはディレクトリの存在を確認し、ディレクトリが存在しない場合はエラー メッセージを出力し、スクリプトの実行を終了します。for
.log サフィックスを持つすべてのファイルをループし、各ファイルで指定されたコマンドを実行します。${file##*/}
$file
変数の最後の / の後の文字列、つまりファイル名 (ディレクトリ パスを削除) を取得できます。
注: このスクリプトを実行する前に、正しいディレクトリで操作していることと、/opt/kafka/bin/kafka-dump-log.sh
コマンドが。
質問をする
${file##*/} を使用してファイル名を取得する方法を説明してください。
ChatGPT の回答
シェル スクリプトでは、${file##*/} は、パスを含む文字列からファイル名を抽出する一般的な方法です。
具体的には、${file##*/} の ## は、文字列の左側にある最も長い出現箇所を削除することを意味します。つまり、最後の / (パス区切り記号) を見つけて、それとその左側のすべてを削除します。したがって、この操作の後に取得されるのは、文字列のファイル名部分です。
たとえば、/usr/local/bin/bash のファイル パスがある場合、${file##*/} は文字列 bash を返します。これは、パス部分の右側の最後の / であるためです。この構文を使用すると、パス文字列を手動で解析しなくても、ファイル パスからファイル名を簡単に抽出できます。