Я загружаю несколько файлов в папку 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 {} +
То есть проверьте, что файл не указан в режиме w
обрядового a
доступа в l
i s
t o
pen f
iles перед m
открытием v
.
Реализация 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()
что невозможно сделать через файловый дескриптор)).