Как скопировать все файлы в папке, за исключением файлов, которые находятся в процессе записи?

Как скопировать все файлы в папке, за исключением файлов, которые находятся в процессе записи?

Я загружаю несколько файлов в папку 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доступа в li st open files перед 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()что невозможно сделать через файловый дескриптор)).

Связанный контент