Không hiệu quả lắm, nhưng bạn có thể làm:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
Đó là kiểm tra xem các tập tin không được liệt kê với một w
nghi thức a
chế độ ccess trong l
i s
t của o
bút f
Iles trước m
o v
ing.
Việc psmisc
triển khai fuser
như thường thấy trên các hệ điều hành dựa trên Linux có một -w
chức năng (để kiểm tra các tệp đang mở để ghi) nhưng thật không may, nó chỉ hoạt động -k
để tiêu diệt các tiến trình tương ứng. Tuy nhiên, có vẻ như bạn vẫn có thể sử dụng nó bằng cách sử dụng tín hiệu giả 0 mà không làm gì:
find /folder/downloading -type f -exec sh -c '
for file do
fuser -s -w -k -0 "$file" || mv "$file" /folder/downloaded
done' sh {} +
Xóa -s
(hoặc thậm chí thay thế nó bằng -v
) nếu bạn muốn xem quá trình (đang) ngăn chặn việc di chuyển.
Lưu ý rằng nếu bạn không chạy các lệnh đó với tư cách là siêu người dùng, bạn sẽ chỉ nhận được thông tin về các quy trình của mình. Nếu các quá trình tải xuống các tệp đang chạy như một người dùng khác, chúng sẽ vẫn không bị phát hiện.
Cũng lưu ý rằng trừ khi bạn di chuyển các tệp sang một hệ thống tệp khác, việc di chuyển các tệp sẽ không ngăn bất kỳ quy trình nào hiện đang ghi vào tệp để hoàn tất ghi vào tệp.
Tuy nhiên, phụ thuộc vào những gì họ đã được thiết kế để làm sau đó, họ có thể bị nhầm lẫn nếu sau khi họ hoàn thành văn bản, tập tin không còn ở đó (ví dụ nếu họ muốn thay đổi một số thuộc tính của tập tin sau khi tải về nó và làm như vậy không thông qua bộ mô tả tệp (như chmod()
vs fchmod()
, hoặc utimes()
không thể được thực hiện thông qua bộ mô tả tệp)).
%.part
sau đó đổi tên thành%). Sau đó, nếu trình tải xuống hoạt động tốt (không có gì khác lạ), thì bạn sẽ có thể đổi tênmv
các tệp ( ).