あまり効率的ではありませんが、次のことができます。
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
これは、ファイルがでリストされていないことをチェックですw
儀式a
でCCESSモードl
I s
のトンo
ペンf
前イレスm
O v
INGの。
Linuxベースのオペレーティングシステムで一般的に見られるのpsmisc
実装には(書き込み用に開いているファイルをチェックするための)機能fuser
があり-w
ますが、残念ながら-k
対応するプロセスを強制終了する場合にのみ機能します。ただし、何もしない擬似信号0を使用することで、引き続き使用できるようです。
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
移動を妨げているプロセスを確認したい場合は、削除します-s
(または置き換え-v
ます)。
これらのコマンドをスーパーユーザーとして実行していない場合、プロセスに関する情報のみを取得することに注意してください。ファイルをダウンロードするプロセスが別のユーザーとして実行されている場合、それらは検出されないままになります。
また、ファイルを別のファイルシステムに移動する場合を除き、ファイルを移動しても、現在ファイルに書き込んでいるプロセスがファイルへの書き込みを終了することはありません。
彼らは書き込みを完了した後、ファイルがなくなっている場合は、それらは後で行うように設計されてきたものに依存し、それらを混同しないかもしれないが(例えば、彼らはそれをダウンロードした後、ファイルのいくつかの属性を変更したいとあれば、そうではありませんファイル記述子を介して(chmod()
vsなどfchmod()
、またはファイル記述子を介して実行utimes()
できない)。
%.part
から%に名前変更する)。次に、ダウンローダーが正常に動作している(奇妙なことは何もしない)場合、mv
ファイルの名前を変更()できるはずです。