ディレクトリ内のファイルがディレクトリ内の他のアプリケーションからコピー/ロードされていることを確認するための次のコードがあります。
パスワード:
for file in PATH/*
do
lsofresult=`lsof | grep $file | wc -l`
while [ $lsofresult != 0 ]; do
echo "still copying file $file..."
sleep 1
lsofresult=`lsof | grep $file | wc -l`
done
done
ループの戻りコードは追加のロジックに使用されます。ただし、ファイルがディレクトリに入ると、ループは続行されます。しかし、他のアプリケーションからディレクトリにコピーしたファイルを処理したいと思います。
そこで理想的には、1つのファイルがコピーが完了したディレクトリに2つのファイルがコピーされる場合、コピーが完了するにつれて完成したファイルを処理し、コピーされた状態の別のファイルを一度作業してもらいたいと思います。完了しました。ディレクトリにコピーされたファイルとコピーされるファイルを区別するオプションはありますか?それでは誰でも助けることができますか?
ベストアンサー1
私があなたを正しく理解した場合、あなたの考えには論理的なエラーがあります。別のファイルがまだコピーされている間に、あるファイルのコピーが完了したことを確認しようとしています。今まではそんなに良くなった。
しかし、私の考えでは、あなたと同じようなものを使っていると思いますfor PATH/*
。おそらく cp path/* destination/*
? - コマンドはファイルを1つずつコピーしますが、同時にバックグラウンドですべてのファイルを同時にチェックしてcpコマンドが実行されていることを確認し、そうでない場合はそのファイルに対して別の操作を実行しようとします。 。 cpがまだファイルをコピーしていないことをどうやって確認しますか?少なくとも両方を確認したい場合は、psofとは機能しません。
実際に行うことは、ファイルがターゲットにすでに存在し、ソースファイルと同じハッシュを持っていることを確認することです。これでのみ、ファイルが正常にコピーされたことを確認できます。
これにより、目標が何であるか、現在のスクリプトが望むように機能しない理由についてより良いアイデアを得ることができます。
残念ながら、このレビューは少し長いです。
私は実際に座って、あなたが説明する内容に使用できるスクリプトを作成しました。最適化されているかどうかはわかりませんが、少なくともコピーの進行中にスキャンが実行され、コピーが完了した後も作業を続けます。
#! /bin/bash
SOURCEPATH="/path/to/sourcefiles"
DESTINATION="/path/to/destination"
FILES=`find $SOURCEPATH -type f`
function copy {
cp $SOURCEPATH/* $DESTINATION
}
function nextfunction {
#Could also do something else with the file already
echo "Done copying" $1
}
function check {
#Output so we see that the checks run simultaniously
echo "original path variable:" $1
echo "filename:" ${1##*/}
hashOfInputFile=`md5sum $1 | cut -d" " -f1`
#make sure the file actually exists before trying to create a hashsum
while [ ! -f $DESTINATION/${1##*/} ]; do
sleep 5
done
#create a first hashsum to check if the file is completly copied
hashOfCopiedFile=`md5sum $DESTINATION/${1##*/} | cut -d" " -f1`
#check if the hashsums are the same if not wait a little and create a new one
while [ "$hashOfInputFile" != "$hashOfCopiedFile" ]; do
sleep 5
hashOfCopiedFile=`md5sum $DESTINATION/${1##*/} | cut -d" " -f1`
done
#proceed to do something else with the source file
nextfunction $1
}
#put the copy in the background so we can proceed with the script
copy &
for file in $FILES
do
#checks are also put in the background so the script continues
check $file &
done