作成中のファイルを除いて、フォルダ内のすべてのファイルをコピーする方法は?

作成中のファイルを除いて、フォルダ内のすべてのファイルをコピーする方法は?

複数のファイルをフォルダにダウンロードし、downloading複数のファイルをフォルダにダウンロードしました。HTTPie。 bashスクリプトはダウンロードしたファイルを処理するように設計されているので、以下のようにダウンロードしたファイルを別のフォルダにコピーしてみました。

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

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

ベストアンサー1

それほど効率的ではありませんが、次のようにできます。

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

つまり、閉じる前に、ファイルのiにファイルがw意識アクセスモードでリストされていないことを確認してください。alsofmv

通常、Linuxベースのオペレーティングシステムで見つかった実装psmiscには機能(書き込み用に開いているファイルの確認)がありますが、残念ながらそのプロセスを終了するためにのみ使用できます。しかし、何もしない偽の信号0を使用すると、まだ使用できるようです。fuser-w-k

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()vsfchmod()またはutimes()ファイル記述子を介して実行できない)

おすすめ記事