Не очень эффективно, но вы могли бы сделать:
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
) файлы.