HTTPie を介して複数のファイルをフォルダdownloading
にダウンロードします。 bashスクリプトはダウンロードされたファイルを処理することを目的としており、ダウンロードしたファイルを別のフォルダーにコピーしようとしました。
find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;
ただし、これにより、まだ完成していないファイルもコピーされます。コマンドに-mmin +5
を追加して、古いファイルへの転送を制限しようとしました。ファイルを書き込んだままにして、ダウンロードしたファイルのみを転送するための効率的なコマンドは何ですか?
あまり効率的ではありませんが、次のことができます。
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
pen a
ilesのl
i s
tのo
rite f
ccessモードでリストされていないことを確認します。 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
に置き換えます)。
これらのコマンドをスーパーユーザーとして実行していない場合は、プロセスに関する情報のみを取得することに注意してください。ファイルをダウンロードするプロセスが別のユーザーとして実行されている場合、それらは検出されないままになります。
また、ファイルを別のファイルシステムに移動しない限り、ファイルを移動しても、現在ファイルに書き込んでいるプロセスがファイルへの書き込みを終了するのを妨げることはありません。
ただし、後で行うように設計されているものによっては、書き込みが終了した後にファイルが存在しなくなった場合(たとえば、ダウンロード後にファイルの一部の属性を変更したい場合など)、混乱する可能性があります。 notファイル記述子経由(ファイル記述子経由では実行できないchmod()
vs fchmod()
、またはutimes()
など))。