web-dev-qa-db-ja.com

書き込まれているファイルを除いて、フォルダ内のすべてのファイルをコピーするにはどうすればよいですか?

HTTPie を介して複数のファイルをフォルダdownloadingにダウンロードします。 bashスクリプトはダウンロードされたファイルを処理することを目的としており、ダウンロードしたファイルを別のフォルダーにコピーしようとしました。

find /folder/downloading -type f -exec mv '{}' /folder/downloaded \;

ただし、これにより、まだ完成していないファイルもコピーされます。コマンドに-mmin +5を追加して、古いファイルへの転送を制限しようとしました。ファイルを書き込んだままにして、ダウンロードしたファイルのみを転送するための効率的なコマンドは何ですか?

12
Googlebot

あまり効率的ではありませんが、次のことができます。

find /folder/downloading -type f -exec sh -c '
  for file do
    lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
  done' sh {} +

つまり、ファイルがwpen ailesのli stのorite fccessモードでリストされていないことを確認します。 mo vingの前。

Linuxベースのオペレーティングシステムで一般的に見られるpsmiscfuser実装には、-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()など))。

11