LINUX.ORG.RU
ФорумAdmin

Как правильно исключить /proc, /dev и /sys из поиска?

 ,


0

1

Здравствуйте. Решаю простую задачу: мне нужно для каждого скрипта, что хранится в системе, проверить заголовок с копирайтами. file отдает мне 100% скрипт (насколько это можно), так как есть и питоновские, и баш и пр. Эта часть, в общем-то, работает. Но никак не могу заставить find пропускать каталоги, в которых не надо искать (вообще туда не заглядывать): /dev, /sys и главное - /proc. Может еще добавлю своих позже, но сейчас заставить бы хоть на этих работать. Ищу следующим запросом:

find / \( -path '/proc' -o -path '/dev' -o -path '/sys' \) -prune -o -type f -exec bash -c '[[ $(file -b "'{}'") == *"script"* ]] && (check_file_hdr.sh "'{}'")' \; 2>&1

Так вот иногда(!) это работает. А иногда нет. Не могу понять причины. Иногда это зависает и я вижу, что check_file_hdr.sh получил какую-то дичь из /proc. Я привел кусок кода, чтобы не забивать ненужными данными, может пропустил кавычки. Код запускается, но работает нестабильно. В официальной документации приведен подобный пример, вроде взял его, немного доработав. Подскажите, пожалуйста, где я ошибся? Спасибо


Если нужно ограничить поиск только устройством, на котором расположен root-раздел, то find / -xdev. Если более точно, аргумент -xdev указывает find ограничиться только одной файловой системой.

QsUPt7S ★★
()
Последнее исправление: QsUPt7S (всего исправлений: 1)
Ответ на: комментарий от QsUPt7S

Возможно это поможет автору (хотя ему кроме root надо ещё вручную указывать /usr /var /home надо будет), но всё-таки почему find ищет так где ему сказали этого не делать - само по себе интересный вопрос, наверно.

firkax ★★★★★
()

find ... ! -regex '^/dev/.*' ! -regex '^/proc/.*' ! -regex '^/sys/.*'

teod0r ★★★★★
()

А не хочешь заюзать mlocate? Можно отдельно для этого конкретного дела сделать базу и исключить ненужные ФС и каталоги через updatedb.conf. Работать будет быстрее, чем каждый раз обшаривать везде.

papin-aziat ★★★★★
()

Надо либо указать * в path, либо явно искать директории т.е. либо

find /  \( -path '/proc/*' -or -path '/dev/*' -or -path '/sys/*' \) -prune -or -type f -print

можно без звёзд, но тоды так надо

find /  -type d \( -path '/proc' -or -path '/dev' -or -path '/sys' \) -prune -or -type f -print
vtVitus ★★★★★
()
Ответ на: комментарий от firkax

С find, наверное, больше всего непонятное среди всех команд Линукс

netvis
() автор топика
Ответ на: комментарий от netvis

path принимает pattern и соответственно /proc означает только /proc и ничего более. т.е. ты исключил /proc, но не всё что в нём находится. Как-то так. Второй вариант там явно указано, что исключаются директории.

>find /  -path '/proc' 2> /dev/null
/proc

>find /  -path '/proc/*' 2> /dev/null
/proc/fb
/proc/fs
/proc/fs/ext4
/proc/fs/ext4/md0
/proc/fs/ext4/md0/fc_info
/proc/fs/ext4/md0/options
/proc/fs/ext4/md0/mb_stats
/proc/fs/ext4/md0/mb_groups
/proc/fs/ext4/md0/es_shrinker_
...

>find /  -path '/proc*' 2> /dev/null
/proc
/proc/fb
/proc/fs
/proc/fs/ext4
/proc/fs/ext4/md0
/proc/fs/ext4/md0/fc_info
/proc/fs/ext4/md0/options
/proc/fs/ext4/md0/mb_stats
/proc/fs/ext4/md0/mb_groups
/proc/fs/ext4/md0/es_shrinker_info
/proc/fs/ext4/md0/mb_structs_summary
/proc/fs/ext4/md1
...

vtVitus ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.