Как вывести список файлов, которые НЕ открыты с помощью команды поиска

Я хочу "перечислить" все файлы, которые НЕ открыты, в определенном каталоге с помощью команды поиска GNU. Теперь я могу перечислить файлы, которые открыты, но не могу найти способ сделать это наоборот.

find /my/dir/* -exec lsof {} \;  

Есть идеи, как это можно сделать?

2 ответа

Решение
find /my/dir -type f | while read filename ; do fuser -s $filename || echo $filename ; done

Это использует find только для генерации списка файлов. Затем цикл while перебирает список результатов, для каждого запускаемого результата fuser -s $filename который завершится с успехом, если что-то использует файл.

|| echo $filename "part" означает "если сбой fuser (то есть файл никто не использует), выведите имя файла"

Вот что я использую

$ find . ! -exec sudo fuser -s "{}" 2>/dev/null \; -exec echo {} \;

Он использует две аккуратные функции find:

  • execs соединены вместе, аналогично операции bash &&, Если первый exec возвращает ненулевой код завершения, тогда второй exec не вызывается.
  • ! является обратной операцией для кода выхода. fuser возвращает 1 для файла, к которому нет доступа, и 0 для файла, к которому получен доступ, поэтому нам нужно перевернуть его, чтобы получить то, что вы хотите.

Обратите внимание, что я добавил sudo для fuser, чтобы он мог найти файлы, открытые другими пользователями. Без этого он с радостью сообщит, что файл не открыт, в то время как на самом деле он просто сообщает, что файл не открыт процессом, который вы имеете право контролировать

Также стоит упомянуть - очевидно, что вызов fuser обходится дороже, чем просто проверка информации inode, поэтому, если у вас есть некоторые другие фильтры, которые вас интересуют, в дополнение к "это открытый файл", вы должны сначала применить эти фильтры к находке, прежде чем делать чем дороже проверка фьюзера

Другие вопросы по тегам