我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
訪問模式列出。l
s
o
f
m
v
通常在基於 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()
無法透過檔案描述符完成))。