Как вывести список файлов, которые НЕ открыты с помощью команды поиска
Я хочу "перечислить" все файлы, которые НЕ открыты, в определенном каталоге с помощью команды поиска 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
:
exec
s соединены вместе, аналогично операции bash&&
, Если первый exec возвращает ненулевой код завершения, тогда второй exec не вызывается.!
является обратной операцией для кода выхода.fuser
возвращает 1 для файла, к которому нет доступа, и 0 для файла, к которому получен доступ, поэтому нам нужно перевернуть его, чтобы получить то, что вы хотите.
Обратите внимание, что я добавил sudo
для fuser, чтобы он мог найти файлы, открытые другими пользователями. Без этого он с радостью сообщит, что файл не открыт, в то время как на самом деле он просто сообщает, что файл не открыт процессом, который вы имеете право контролировать
Также стоит упомянуть - очевидно, что вызов fuser обходится дороже, чем просто проверка информации inode, поэтому, если у вас есть некоторые другие фильтры, которые вас интересуют, в дополнение к "это открытый файл", вы должны сначала применить эти фильтры к находке, прежде чем делать чем дороже проверка фьюзера