
私はbashスクリプトに初めて触れましたが、使用する必要があります。
ディレクトリを繰り返して、すべてリモートサーバーにアップロードしたいと思います。その後、削除する必要があります。
今私が持っている問題は次のとおりです。 tcpdumpがこのディレクトリにpcapデータを(回転したファイルと共に)書き込んでいるので、最新のファイルをアップロードしたくありません。ディレクトリを繰り返すときに最新のディレクトリを100%スキップするにはどうすればよいですか?ファイルを作成してアップロードするプロセスは並行して行われるため、アップロードが開始されるとすぐに「新しい」最新のファイルがある可能性があります。 2つの最新のアップロードをスキップしても大丈夫ですが、今は最新のファイルをアップロードしたくありません。
「一般」ループの解決策を読んで bash スクリプトを学習しようとしていますが、構文は非常に混乱しています。したがって、開始点を支援したり、初心者にできる部分的な解決策を教えていただきありがとうございます。わかります。
ありがとうございます!
PS:最新のファイルには最新のタイムスタンプもあります。
答え1
シェルを使用し、アップロードコマンドがコマンドラインのリストとしてすべてのファイルでzsh
呼び出されるとします。upload
upload ./*(.Dom[2,-1])
glob修飾子(.Dom[2,-1]))
は、前のglobbingパターン(*
)が通常のファイル(.
glob修飾子を使用し、D
glob修飾子を使用して隠されたファイルを含む)のみを一致させ、パターン拡張に最近変更されたファイルは含まれません(om
シェルにファイルの並べ替えを指示する)。修正時間まで、Poke はファイルをソートし、[2,-1]
結果リストの最初のファイルを除くすべてのファイルを選択します。
その後、同じパターンを使用して転送されたファイルを削除したり、ループを使用したりできます。
for name in ./*(.Dom[2,-1]); do
upload $name
rm -f $name
done
これは、スペース、タブ、または改行を含むファイル名など、あらゆる種類のファイル名を処理する必要があります。
答え2
lsの-tオプションを使用すると、変更に基づいてファイルをソートできます。 tailコマンドと一緒に使用すると、最初のファイルを除くすべてのファイルを印刷できます。このような:
ls -t | tail -n +2
ループでは、次のように見えます。
for my_file in $(ls -t | tail -n +2); do upload $my_file; rm $my_file; done
答え3
# find the latest file
latestf="$(ls -t /directory/*|head -1)";
# loop over files now
for f in /directory/* ; do
if [[ "${f}" == "${latestf}" ]];then
echo "skipping file [${f}]";
else
echo "processing file [${f}]";
# your upload cmd here
fi
done