Не дуже ефективно, але ви можете зробити:
find /folder/downloading -type f -exec sh -c '
for file do
lsof -F a "$file" | grep -q w || mv "$file" /folder/downloaded
done' sh {} +
Тобто перевірка , що файл не вказано в списку з w
обрядовим a
режимом ступи в l
я s
т o
перо f
Ільза перед тим m
про v
ING.
psmisc
Реалізація , fuser
як правило , знаходяться на Linux операційних систем на основі має -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
), якщо ви хочете побачити, який процес (ів) перешкоджає переміщенню.
Зауважте, що якщо ви не використовуєте ці команди як суперкористувач, ви отримаєте лише інформацію про ваші процеси. Якщо процеси, що завантажують файли, виконуються як інший користувач, вони залишаться не виявленими.
Також зауважте, що, якщо ви не переміщуєте файли до іншої файлової системи, переміщення файлів не завадить будь-якому процесу, який зараз записується у файл, закінчити писати до нього.
Однак, залежно від того, що вони були розроблені після цього, вони можуть бути заплутані, якщо після закінчення запису файл більше не буде (наприклад, якщо вони хочуть змінити деякі атрибути файлу після завантаження і зробити це не через дескриптор файлу (наприклад, chmod()
vs fchmod()
або utimes()
що неможливо зробити через дескриптор файлу)).
%.part
а потім перейменуйте на%). Тоді якщо завантажувач добре поводиться (не має нічого іншого дивного), то ви повинні мати можливість перейменовувати (mv
) файли.