如何複製資料夾中除正在寫入的文件之外的所有文件?

如何複製資料夾中除正在寫入的文件之外的所有文件?

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儀式a訪問模式列出。lsofmv

通常在基於 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()vs fchmod(),或utimes()無法透過檔案描述符完成))。

相關內容