Мой сайт
Главная | Каталог статей | Регистрация | Вход
Вторник
18.12.2018
22:05
Приветствую Вас Гость | RSS
Главная » Статьи » Linux и Unix

Linux: примеры поиска файлов часть 3

Ограничиваем поиск конкретной директорией и уровнями вложенных поддиректорий

Для начала сделаем поиск passwd в корневой директории root и всех поддиректориях. Эта команда проведет поиск во всех каталогах, куда Вам разрешен доступ; если Вы не имеете прав прочесть содержимое каталога, find сообщит, что поиск в данном каталоге Вам запрещен.

# find / -name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd

Теперь ограничим поиск самой корневой директорией root (level 1) и поддиректориями (level 2).

# find -maxdepth 2 -name passwd
./etc/passwd

Теперь ограничим поиск корневой директорией и поддиректориями для уровня ниже (level 2, level 3)

# find / -maxdepth 3 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd

Теперь ограничим поис файлов между уровнями level 2 и level 4

# find -mindepth 3 -maxdepth 5 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd

Поиск файлов с одновременным выполнением операций над ними

Найдём все файлы MyCProgram.c без учёта регистра букв и одновременно вычислим для каждого из них  md5sum. Внутри фигурных скобок будут автоматически подставлять найденные файлы.

md5sum — программа, позволяющая вычислять значения хеш-сумм (контрольных сумм) файлов по алгоритму MD5. В обычном случае вычисленные хеши выводятся (можно сохранить в файле, для последующего использования). В других случаях, программа сверяет вычисленные значения со значениями, сохраненными в файле (это удобно для массовой проверки целостности файлов). Наиболее часто программа используется для проверки правильной загрузки файлов по сети.

# find -iname "MyCProgram.c" -exec md5sum {} ;
d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c
d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c

Какие действия можно выполнять при поиске:

  • -print Выводит полный путь с именем файла в стандартный вывод
  • -ls Выводит полный листинг файла (эквивалентно команде ls -dils)
  • -delete  Удаляет файл
  • -exec command Выполняет указанную команду. Все последующие аргументы до появления; считаются аргументами команды. Строка {} заменяется именем текущего файла

Вот пример, в котором используется действие -exec, которое перемещает все найденные файлы в каталог для резервного копирования. Здесь есть несколько вещей, которые нужно отметить. Обозначение {} будет заменено на полный путь найденного файла, а ; используется для обозначения окончания команды, следующей за -exec. Помните, что ; — это также специальный символ оболочки, и нужно поставить перед ним обратный слэш, чтобы оболочка его не обрабатывала.

$ find ~ -mtime +365 -exec mv {} /tmp/mybackup ;

Чтобы найти все файлы в каталоге  /html/ с расширением .html, и вывести строки из этих файлов, содержащие слово organic, введите:

$ find ~/html/ -name '*.html' -exec grep organic '{}' ';'

Чтобы ввести подтверждение выполнения команды для файла, найденного find, используйте ключ-ok вместо -exec. Чтобы удалить из Вашего домашнего каталога файлы, доступ к которым осуществлялся более года назад, с подтверждением для каждого файла, введите:

$ find ~ -used +365 -ok rm '{}' ';'

Поиск файлов, не являющихся тем, что указано в условии

Найдем файлы, имя которых не совпадает с MyCProgram.c (регистр букв не учитывается). При этом искать будем только в текущей директории (level 1)

# find -maxdepth 1 -not -iname "MyCProgram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c

Еще вариант использовать вместо -not обратный слеш с восклицательным знаком:

# find ! -iname "MyCProgram.c”

Найдем файлы в каталоге /bin, владельцем которых не является root:

$ find /usr/bin ! -user root

Поиск файла по уникальному номеру inode

В информатике инодом (или индексным дескриптором) (произносится айнод или инод) называют структуру данных в традиционных файловых системах Unix, таких как UFS. Инод хранит основную информацию о постоянных файлах, каталогах или других объектах файловой системы. А слово node переводится как узел, узловая точка. 
При создании файловой системы создаются также и структуры данных, содержащие информацию о файлах. Каждый файл имеет свой инод, идентифицируемый по номеру инода (часто называемый 'i-номером' или инодом), в файловой системе, в которой располагается сам файл. 
Иноды хранят информацию о файлах, такую как принадлежность владельцу (пользователю и группе), режим доступа (чтение, запись, запуск на выполнение) и тип файла. Существует определенное числоинодов, которое указывает максимальное количество файлов, допускаемое определенной файловой системой. Обычно, при создании файловой системы примерно 1% ее выделяется под иноды.

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

# touch "test-file-name"

# touch "test-file-name "
[Примечание: Пробел в конце файла]

# ls -1 test*
test-file-name
test-file-name

Теперь с помощью опции –i покажем в листинге их номера inode, они различны:

# ls -i1 test*
16187429 test-file-name
16187430 test-file-name

При поиске файлов тоже можно использовать его номер inode, используя -inum. Найдём файл сinode=16187430 и переименуем его. При последующем листинге увидим, что изменилось имя одного файла с тем самым inode.

# find -inum 16187430 -exec mv {} new-test-file-name ;

# ls -i1 *test*
16187430 new-test-file-name
16187429 test-file-name

Можно пользоваться этой техникой при совершении действий над файлами с малоинформативными названиями. Например, файл file?.txt содержит спецсимвол — вопросительный знак, который обычно используется в поиске для указания, что на его месте может быть любо символ. Поэтому если вы попытаетесь удалить этот файл rm file?.txt  , то удалятся все три файла, которые похожи на него по имени и содержат в позиции вопросительного знака цифры 1 и 2. Итак, у нас три файла:

# ls
file1.txt file2.txt file?.txt

Чтобы удалить файл с вопросительным знаком, покажем их inode:

# ls -i1
804178 file1.txt
804179 file2.txt
804180 file?.txt

И теперь удалим только файл с inode=804180

# find -inum 804180 -exec rm {} ;

# ls
file1.txt file2.txt
[Note: The file with name "file?.txt" is now removed]

С другой стороны, пример надуман, потому что существует более простой способ удаления file?.txt

rm "test?.txt”


Источник: http://bestann.com.ru/comments/linux_find/
Категория: Linux и Unix | Добавил: SAM (20.07.2010)
Просмотров: 3687 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Категории раздела
Мои статьи [1]
Linux и Unix [47]
Все про Linux и Unix
Windows [3]
Все про Windows
Администрирование [5]
Все для Системного администратора
Cisco [2]
Мой опыт работы с кисками
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Copyright MyCorp © 2018
    Бесплатный конструктор сайтов - uCoz