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

Вы не используете grep. Используйте awk .

"your data" | awk '$1 ~ /\.[05]00/'
12
29.05.2017, 18:41
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режим доступа в list of open ffiles перед moving.

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(), что невозможно сделать через дескриптор файла)).

11
27.01.2020, 19:56

Теги

Похожие вопросы