Freebsd как найти файл

Обновлено: 06.07.2024

Примечание: find -s и find | sort могут давать разные результаты.

-x Запретить find спускаться в каталоги, имеющие номер устройства, отличный от такового у файла, с которого начался обход. Эта опция эквивалентна устаревшему примитиву -xdev.

Примитивы

Операторы

Примитивы могут комбинироваться с использованием нижеследующих операторов. Операторы перечислены в порядке понижения приоритета. ( выражение ) Будет истинным, если истинно выражение в скобках. ! выражение -false выражение -not выражение Это унарный оператор НЕ. Он будет истинным, если выражение ложно. выражение -and выражение выражение выражение Оператор -and есть логический оператор И. Поскольку он подразумевается непосредственным соседством двух выражений, его не требуется указывать явно. Выражение истинно, если оба выражения истинны. Второе выражение не вычисляется, если первое выражение ложно. выражение -or выражение Оператор -or есть логический оператор ИЛИ. Выражение истинно, если любое из двух выражений истинно. Второе выражение не вычисляется, если первое выражение истинно. Все операнды и примитивы должны быть отдельными аргументами find. Примитивы, имеющие собственные аргументы, ожидают их как отдельные аргументы find. Окружение Переменные окружения LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES и LC_TIME влияют на выполнение утилиты find, как описано в environ(7). Примеры Возможные проблемы Специальные символы, используемые find, являются также специальными символами для многих командных оболочек. В частности, может потребоваться экранировать от командной оболочки символы *, [, ], ?, (, ), !, \ и ;. Поскольку не существует разделителей, отделяющих опции от имён файлов или имена файлов от выражений, трудно задать файлы с именами типа -xdev или !. Эти проблемы решаются опцией -f и конструкцией -- для getopt(3). Примитив -delete плохо взаимодействует с другими опциями, меняющими порядок обхода дерева файловой системы. Примитивы -mindepth и -maxdepth фактически являются глобальными опциями ( как документировано выше ). Они, по-видимому, должны быть заменены опциями, выглядящими как опции.

Блог системного администратора Windows/Linux/FreeBSD

Путь - где искать файлы, можно использовать список путей через пробел.

Опции - начиная с символа «-», после идет название опции:
-d Поиск в подкаталогах перед поиском в самом каталоге
-L При поиске следовать по символическим ссылкам
-maxdepth N При поиске проверять не более чем N вложенных уровней каталогов
-mindepth N Не проверять вложенные каталоги уровня N и меньше
-mount Не искать в каталогах других файловых систем

Параметры поиска

Примеры использования команды find с использованием параметров:

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.

Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.

Короткая форма Длинная форма Описание
!критерий -not Отрицание (возвращает true, если критерий false)
критерий1-a критерий2 -and Оператор И (true, если критерий1 и критерий2 true)
критерий1-o критерий2 -or Оператор ИЛИ (true, если критерий1 или критерий2 true)

В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.

Примеры использования команды find с использованием операторов

Найти в текущем каталоге файлы, начинающиеся с символа «%» или c «temp» и являющиеся файлами (-type f), а не каталогами.

Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600MB и менее 1GB (-size) или файлы имя которых заканчивается на «.mpeg» (-name).

Действия над файлами
Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

-exec команда \; - Выполнить команду. Обратите внимание, что после команды ставится обратный слэш и точка с запятой.
-execdir команда \; - То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл.
-ok команда \; - То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды.
-okdir команда \; -То же что ok для execdir.
-print - Вывод имени файла на экран.
-ls - Выполнение команды ls -dils над текущим файлом.

В выполняемых командах вы можете использовать параметр <> в качестве аргумента, который заменяется путем к текущему файлу.

Примеры использования команды find с использованием действий

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «

», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).

Поиск файлов по их размеру

Будут найдены и выведены на экран файлы с расширением *.log, размером от 1кб до 1000кб

Поиск файлов по их владельцу и группе

Эта команда найдет все файлы, у которых нет владельца

Параметры -user или -uid позволяют искать файлы по идентификатору пользователя (UID) и по имени пользователя, а параметр -group по имени группы.

Найдет все файлы в текущем каталоге с расширением log пользователя root и группы root

Найдет все файлы пользователя root или www

Использование регулярных выражений

Утилита find поддерживает регулярные выражения. Сразу приведем пример. Скажем, я хочу найти все файлы, расширения которых .php или .js. Я бы мог выполнить это следующим образом:

Это выглядит немного сложно, не так ли? В качестве опровержения укажем, что здесь используется синтаксис egrep (-regextype posix-egrep), а затем задается регулярное выражение, используемое для поиска. Выражение начинается и заканчивается одиночными кавычками для того, чтобы чтобы сама shell-оболочка не пыталась обработать регулярное выражение. Затем идет выражение .*, где используется универсальный символ, соответствующий любому символу или набору символов. Часть (php|js) говорит о том, что надо искать php или js. Конвейер (|) в этом выражении соответствует логическому выражению "или". Наконец, знак доллара ($), которым заканчивается выражение, говорит о том, что эти расширения мы ищем в конце имени файла. Так что если у вас есть файл с именем js.txt, он не будет соответствовать критерию поиска.

Работа со временем
В утилите find есть все для поиска по времени работы с файлом. Вы можете искать по времени доступа (-atime), либо по времени последней модификации файла (-mtime), либо по времени последнего его изменения (-ctime).

Например, давайте найдем все файлы, которые не модифицировались последние два дня:

Если вы хотите искать файлы в определенном диапазоне, вы можете комбинировать варианты. Так команда find -mtime +2 -mtime -5 будет означать "два или более дней назад, но не более чем на пять дней назад".

Работаем с минутами
Иногда вам требуется искать файлы, модифицированные в течение прошедшего дня, а предыдущие варианты поиска не слишком точны для этого. Утилита find хороша тем, что в ней также есть параметры -amin, -cmin и -mmin, которые похожи на ранее рассмотренные параметры, но в них используются минуты, а не дни. Так что если вы хотите посмотреть на то, какие файлы были изменены или к каким из них был доступ в последний день, вы можете использовать эти параметры.

Ограничения на поиск
Иногда утилита find предоставляет больше результатов, чем вам нужно. Вы можете ограничить результаты поиска, выдаваемые утилитой find, указав для этого параметр maxdepth. Например, если вы хотите найти все JavaScript файлы в директории WordPress, вы можете использовать следующую команду:

Но что, если вы хотите видеть только те JavaScript файлы, которые находятся в директории на самом верхнем уровне? Вы можете ограничить поиск с помощью параметра -maxdepth:

Поиск будет осуществляться только в директории WordPress, но не в поддиректориях. Если изменить значение -maxdepth на 2, то поиск будет осуществляться в поддиректориях директория WordPress, но не в более глубоких поддиректориях.

Комбинируем утилиту find с другими командами
Теперь, когда вы нашли файлы, которые искали, что вы собираетесь с ними делать? Вы можете использовать в утилите find параметры xargs или -exec, которые позволяют указывать действие, выполняемое над файлами после того, как вы их найдете.

Допустим, вы хотите изменить владельца файла с root на www-data сразу для большого количества файлов. Поиск всех этих файлов является только первым шагом, вам нужно также изменить владельца файла. Делать это вручную по списку, который возвратила утилита find, весьма утомительно. Поэтому для смены владельцев файлов вы можете захотеть воспользоваться параметром -exec:

Я пытаюсь найти все копии example.filename на моем сервере FreeBSD. Какой самый лучший / самый простой / самый эффективный способ сделать это?

Хотя ответы будут схожими, вы можете уточнить, используете ли вы Linux или FreeBSD. Они не одно и то же. отредактированное название , чтобы сделать ОС более конкретные Это, вероятно, должно быть помечено FreeBSD, но у меня нет репутации, чтобы сделать это. другие флаги 'find', которые могут быть подходящими, в зависимости от необходимости: -type f (не будет беспокоиться о каталогах или символических ссылках с тем же именем) -ls (чтобы показать детали, такие как размер файла, например, если файлы имеют одинаковые имя, но другое содержание)

Гораздо быстрее, чем find , если вы используете службу locate, и она находит только файлы, которые существовали на момент updatedb последнего запуска (обычно ночью перед управлением заданием cron).

Вы можете запустить updatedb вручную, но это даже медленнее , чем Клетус предполагает и требует корня. Иногда я обновляю базу данных вручную после установки новых вещей. find

Locate работает, только если у вас запущена служба для создания базы данных locate (забудьте, как она называется). Он также может страдать из-за задержки по времени (так как искомый файл может быть добавлен с момента последней сборки). Правки и комментарии пересеклись на проводе. Здорово. Вы, конечно, правы по обоим пунктам. Если вы обнаружите, что делаете find / или работаете с большим деревом чаще, чем раз в неделю, то запуск locate службы, вероятно, стоит того, потому что locate(1) он намного быстрее. @cletus Running sudo periodic weekly обновляет locate базу данных. Запустите его после любой установки или загрузки, которая может содержать нужные вам файлы.

Если у вас установлен locate (он же slocate), то

locate каждый вечер запускает задание cron, которое переиндексирует все файлы на вашем компьютере. По этой причине это не всегда актуально.

Иногда вы хотите найти файлы на определенном уровне каталога. В этом случае может быть удобно использовать подстановочные знаки оболочки:

Очевидно, это работает, только если у вас жесткая структура каталогов.

Как уже упоминалось, locate это быстрый способ найти файл. Эта команда использует предварительно скомпилированный индекс имен файлов и папок. Эта база данных имен ищется, а не сканируется в вашей файловой системе.

Чтобы не учитывать регистр, добавьте -i .

Используемая база данных locate должна быть актуальной. После установки или загрузки, которая может содержать нужный файл, необходимо обновить locate базу данных.

locate База данных будет в конечном итоге будет автоматически обновляться в вашей системе FreeBSD. Существует еженедельный набор дел, включающий эту задачу. Эти обязанности перечислены в /etc/periodic/weekly/310.locate сценарии.

Самый простой и безопасный способ форсировать раннее обновление locate базы данных - это сделать еженедельный набор дел по дому сейчас.

Или вы могли бы даже заставить все обычные обязанности по дому. Возможно, вы захотите сделать это сразу после установки новой системы FreeBSD.

My IT-blog

Руководство по FreeBSD состоит из девяти разделов. Эти разделы выглядят так:
1.General commands (Основные команды)
2.System calls and error numbers (Системные вызовы и коды ошибок)
3.The С libraries(Библиотеки С)
4.Devices and device drivers (Устройства и драйверы устройств)
5.File formats(Форматы файлов)
6.Game instructions (Инструкции к играм)
7.Miscellaneous information(Всякая всячина)
8.System maintenance commands(Команды обслуживания системы)
9.Kernel system interfaces(Системные интерфейсы ядра)

Для того чтобы читать man в конкретном разделе нужно использовать синтаксис:

man N name
Где N номер раздела справки, а name название программы
Пример:
man 4 pf

Секции страницы помощи:
NAME – имя страницы с очень кратким описанием предмета (одна строка)
SYNOPSIS – синопсис, краткий обзор
DESCRIPTION – полное описание предмета справки
ENVIRONMENT – используемые переменные окружения
EXIT STATUS – коды возврата программ
EXAMPLES – примеры использования
SEE ALSO – рекомендуемые man страницы для получения дополнительной информации

2. Основные команды для работы с файлами

Во Фре все это ФАЙЛЫ. устройства это тоже файлы:)
В UNIX существуют различные виды файлов, информация о которых содержится атрибутах файловой системы для этих файлов. Всего в UNIX существует 6 различных видов файлов:
• Обычный файл (regular file)
• Каталог (directory)
• Специальный файл устройства (special device file)
• FIFO, или именованный канал (named pipe)
• Символьная ссылка (symbol link)
• Сокет (socket)

Для фри неважно расширение. Она ориентируется на основании магии! Вернее magic numbers.
Узнать тип файла можно с помощью утилиты file:


%file /etc/rc.conf
/etc/rc.conf: ASCII text
%file /bin/sh
/bin/sh: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.0 (900044), stripped

ls (list files) предназначена для просмотра содержимого каталогов и получения информации о файлах.
ls -a вывод полностью ( со скрытыми файлами и папками )
ls -l вывод в подробной форме ( с правами, размером, датами и т.д.);
ls -i выводит также inode файла
Примеры:

%ls
f1 f2 f3
%ls -la
total 12
drwxr-xr-x 2 root bos 512 16 мар 19:14 .
drwxr-xr-x 5 bos bos 512 29 апр 13:36 ..
-rw-r--r-- 2 root bos 19 16 мар 19:15 f1
-rw-r--r-- 1 root bos 0 16 мар 19:10 f2
-rw-r--r-- 1 root bos 0 16 мар 19:10 f3

pwd (print working directory) показывает текущий рабочий каталог.

%pwd
/usr/home/bos/A

cd (change directory) меняет текущий рабочий каталог.
Путь может быть относительным, а может и абсолютным(начинаться с / )

cd - перейти в домашний каталог
cd .. - подняться на каталог выше
cd

root - перейти в домашний каталог заданного пользователя
cd - - перейти в предыдущий каталог

touch меняет временные метки файла и имеет побочное действие, которое используется гораздо чаще, чем основное – если файла с указанным именем нет, создается пустой файл.

%ls -la | grep -E '[[:space:]]f.*'
-rw-r--r-- 1 bos bos 0 2 май 13:20 ft1
-rw-r--r-- 1 bos bos 0 2 май 13:20 ft2
%touch ft1
%touch ft3
%ls -la | grep -E '[[:space:]]f.*'
-rw-r--r-- 1 bos bos 0 2 май 13:22 ft1
-rw-r--r-- 1 bos bos 0 2 май 13:20 ft2
-rw-r--r-- 1 bos bos 0 2 май 13:22 ft3

rmdir удаляет только пустые каталоги.
-p удаляются и родительские каталоги целевого каталога, если они пусты.

% rmdir /tmp/test
% rmdir -p /tmp/a/b/c

cp позволяет копировать файли и каталоги (опция -r или -R).
При её использовании часто применяются шаблоны шелла. В общем случае, команда cp требует не менее двух параметров: что копировать и куда копировать.

% cp file1 dir1/
% cp -r dir1/ dir2/

mv предназначена для перемещения и переименования файлов и каталогов. При перемещении внутри одного каталога имя исходного файла/каталога меняется на новое, что эквивалентно переименованию. При перемещении внутри одного раздела (одной файловой системы) меняется только жесткая ссылка на объект и процесс перемещения происходит очень быстро. При перемещении данных между различными файловыми cистемами происходит копирование с последующим удалением источника, так что время выполнения команды зависит от объема данных.

%mv file2 file3 - переименовали файл
%mv file3 dir1/ - переместили файл в dir1

ln позволяет создавать символьные (с опцией -s) и жесткие (без опции -s) ссылки.
жесткая ссылка при удалении оригинала, данные все равно будут доступны
–s будет создана мягкая ссылка(как ярлык в винде) при удалении ярлыка с файлом ничего не случается, при удалении файла, ярлык ссылается на пустое место

%ln -s /etc/rc.conf file4

cat вывод содержимого файла

more less выводят содержимое файла с возможностью прокрутки и поиска

which для поиска программ (исполняемых файлов), ищет указанные файлы в каталогах, перечисленных в переменной окружения PATH.
whereis аналогична по действию, но ищет также среди man страниц и в каталогах с исходными текстами программ. Примеры:

% which ls
/bin/ls
% whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

locate Поиск файлов по имени с помощью заранее созданной индексной БД.
/usr/libexec/locate.updatedb cоздание индексной базы
Аналог службы индексирования винды, индексировать нужно руками или по крону:)

tail выводит последние строки файла
-n выводится n строк

% tail -n 5 /var/log/messages

head выводит первые строки файла
-n выводится n строк

%head -n 5 /var/log/messages

cut вырезать из входного потока или файла фрагменты строк,
-с соответствующие определенным позициям символов в строке
-f соответствующие определенным полям, считается, что файл имеет табличную структуру (т. е. разбит на колонки)
-d указывает разделитель полей. По умолчанию табуляция

cut -d: f1,7 /etc/passwd вывести 1й и 7й столбик из файла
cut -c1-5 /etc/passwd вывести символы, в каждой строке, с первого по пятый

Paste противоположность cut, вставляет фрагменты строк и выводит на экран
-d указывает разделитель полей. По умолчанию табуляция
-s объединяет множество строк в файле в одну строку

%paste -d: b1 a1
b1:a1
b2:a2
b3:a3
b4:a4
%paste -s a1
a1 a2 a3 a4

diff выводит разницу между текстовыми файлами или оглавлениями каталогов в формате, который пригоден для последующего использования программой patch. При сравнении двоичных файлов программа diff только сообщает, совпадают или различаются между собой сравниваемые файлы.

% diff каталог1 каталог2 - сравниваем каталоги
% diff /bin/ls /usr/bin/lsvfs -сравниваем бинарные файлы
Binary files /bin/ls and /usr/bin/lsvfs differ

Патчинг проходит элементарно
% patch hello.c patch.txt
Hmm. Looks like a normal diff to me.
..
done

tr замена символов по шаблону

Заменяет маленькие буквы в файле на большие и выводит на экран, сам файл остается без изменений
tr "[:lower:]" "[:upper:]"

tee транслящия stdin в stdout c ведением лога(копированием в файл)

uniq – нахождение дублирующихся строк, если попадается повторяющаяся строка то она не будет выведена.

find осуществляет рекурсивный поиск файлов в файловой системе, не использует базы данных и переменные окружения.
Условия поиска:
-mount или -xdev – осуществлять поиск только в пределах одной физической файловой системы
-name шаблон – поиск файла по его имени
-iname шаблон – то же, но без учета регистра
-regex шаблон – то же, что и name, но шаблон – регулярное выражение
-type тип_файла – поиск файлов указанного типа
b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket

-user пользователь – искать файлы, принадлежащие пользователю
-group группа – искать файлы, принадлежащие группе
-atime N – искать файлы, доступ к которым был N суток назад
-mtime N – искать файлы, которые менялись N суток назад
-size N – искать файлы, размер которых N блоков
Команды:
-exec программа – выполнить указанную программу передав ей имя файла(с помощью <>)
-ok программа – то же, что exec, но с запросом подтверждения для каждого файла
Пример:

% find /usr/share -name index.html

Поиск файлов, которые модифицировались за последние 2 дня и вывод полной информации про них
% find /var/log -ctime 2 -type f -ls
Удаляем записи с сервака, старше 35 дней
% find /var/spool/asterisk/monitor -ctime +35d -exec rm -f <> \;

Читайте также: