SplitはBashで奇妙に動作します。

SplitはBashで奇妙に動作します。

inotifywaitで分割を試してください。デフォルトでは、FTPサーバーでファイルが作成されるとファイルが分割されます。

#!/bin/bash

TARGET=/home/test-directory/incoming
SPLITTED=/home/test-directory/incoming/splitted
PROCESSED=/home/test-directory/incoming/processed
LOGFILE=/var/log/inotify-ftp.log

inotifywait -m -e create -e moved_to --format "%f" $TARGET \
        | while read FILENAME
                do
                        echo Detected $FILENAME >> $LOGFILE
                        echo Splitting $FILENAME >> $LOGFILE
                        split -d -l 1000 "$TARGET/$FILENAME" "$SPLITTED/$FILENAME"
                        #/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv
                        mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME"
                        echo Completed splitting $FILENAME >> $LOGFILE
                done

したがって、以下のコードは単独で実行しても機能します。上記のスクリプトは同じことを行う必要がありますが、長さが数百行しかない最初のパーティションファイルを生成します。

#/usr/bin/split -d -l 1000 /home/test-directory/incoming/test-file.csv /home/test-directory/incoming/splitted/test-file.csv

どうしたの?

答え1

これは、ファイル長がゼロで生成されたためです。スプリットがファイルサイズを特定し、スプリット方法を決定しますが、ftpサーバーにはファイルサイズを増やすための競合状態があります。

分割が読み取りを開始する前にファイルが完全に到着するのを待つメカニズムを用意することは賢明でしょう。通常、統計ファイルは前の1分間に増加が停止するまで繰り返されます。

答え2

すでに説明したように他の場所でcreate追加されたコンテンツを参照せずにファイルが生成されると、イベントが開始されます。ファイル転送サービスがファイルを閉じるまでイベントが実行されないようにイベントを変更inotifywaitします。createclose_write

inotifywait -m -e close_write -e moved_to --format "%f" "$TARGET"

また、プロセスが完全に転送されたファイルと途中で中断されたファイルを区別できるように、いくつかのエラー処理機能を構築する必要があります。これは、ファイルの内容を検証したり、tmp送信が成功したときに送信者がファイル名を変更したときに削除されたサフィックスを使用してファイルを転送することができます。

最後に、良いコーディング方法で変数を使用するたびに二重引用符で囲む必要があることに注意してください。

関連情報