Как пользоваться командой find
Содержание:
- Find Files/Folders by Permissions
- Поиск по размеру файла
- Фильтрация файлов по глубине
- Пример №1
- Специальное копирование файлов в Linux с помощью tar
- GUI
- 10 примеров команд find в Linux
- Найти файлы по типу
- Поиск файлов через терминал. Команда locate
- ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
- Синтаксис команды find
- Поиск через графический интерфейс
- Копирование файлов по регулярным выражениям в Linux
- Примеры использования команды locate.
- Полезные команды whereis и which.
- Управление процессами
Find Files/Folders by Permissions
7. Find Files/Folders by Permissions 777
The command will return all files that have 777 permissions. In this case, it will check all data with the name ‘trial.php’ and has 777 permissions.
8. Find SUID File With Permissions 755
The SUID (Set owner User ID upon execution) is temporary permission set for a file that permits a user to run executable by inheriting access permission of the executable owner. The below command will search for files that have SUID permission 755
9. Look for SGID File With 644 Permission
Akin to SUID, SGID (Set Group ID upon execution) is also temporary permission given to a user to run a file or executable. The primary difference is that it inherits permission of the group when running a file rather than the person logged into the system. One can search SGID files on Linux using the below command
10. Sticky Bit Files With Permissions 755
The sticky bit is another type of permission bit that when assigned on a file will only let the root user delete the file. Therefore, no other users will have the liberty to delete the data that is created by the root user.
So users enable sticky bit to ensure no one can delete the folder or contents. Apart from deletion, users have other full privileges. Below is the one can use the find command on Linux to search for files with permission 755:
Поиск по размеру файла
df -h /boot
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 194M 821M 20% /boot
Найти обычные файлы определённого размера
Чтобы найти обычные файлы нужно использовать
-type f
find /boot -size +20000k -type f
find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
/boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
/boot/initramfs-3.10.0-1160.el7.x86_64.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
Файлы бывают следующих типов:
— : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link
Подробности в статье —
«Файлы в Linux»
find /boot -size +10000k -type f
find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
/boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
/boot/initramfs-3.10.0-1160.el7.x86_64.img
/boot/initramfs-3.10.0-1160.el7.x86_64kdump.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
/boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img
То же самое плюс показать размер файлов
find /boot -size +10000k -type f -exec du -h {} \;
find: ‘/boot/efi/EFI/centos’: Permission denied
find: ‘/boot/grub2’: Permission denied
60M /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img
21M /boot/initramfs-3.10.0-1160.el7.x86_64.img
13M /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img
21M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img
14M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img
Фильтрация файлов по глубине
Чтобы выполнить примеры данного раздела, создайте во временном каталоге структуру каталогов. Она должна состоять из трех уровней каталогов, с десятью каталогами на первом уровне. Каждый каталог (в том числе тестовый каталог) должен содержать десять файлов и десять подкаталогов.
Чтобы создать такую структуру, выполните следующую команду:
cd
mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
cd ~/test
Чтобы ознакомиться с только что созданной структурой и проверить, все ли создано правильно, используйте команды ls и cd. Затем вернитесь в тестовый каталог test:
Данный раздел покажет, как извлекать определенные каталоги из этой структуры. Для начала попробуйте выполнить простой поиск файла по имени:
find -name file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
. . .
Эта команда вывела достаточно объемный результат. Передав этот результат в счетчик, можно увидеть, что в итоге выведено 1111 файлов.
find -name file1 | wc -l
1111
Конечно, в большинстве случаев этот вывод слишком объемный и неудобный. Попробуйте сузить его.
Для этого можно использовать параметр –maxdepth, чтобы задать максимальную глубину поиска:
find -maxdepth num -name query
Чтобы найти file1 в каталогах level1 и выше, укажите максимальную глубину 2 (1 для каталога верхнего уровня и 1 для каталогов level1).
find -maxdepth 2 -name file1
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1
Как видите, данный результат имеет гораздо более удобный вид.
Кроме того, можно указать минимальную глубину поиска:
find -mindepth num -name query
Это используется для поиска файлов, которые находятся в конце ветвей каталога:
find -mindepth 4 -name file
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .
Опять же, данный результат будет содержать огромное количество файлов (1000).
Максимальную и минимальную глубину поиска можно комбинировать, чтобы уменьшить диапазон поиска:
find -mindepth 2 -maxdepth 3 -name file
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .
Пример №1
Простейший случай, необходимо произвести такую замену с большим количеством файлов:
Для экспериментов создадим директорию .
user ~ $user ~ $ |
mkdir ~/test/ cd ~/test/ |
user test $ |
touch {1..5}-filename.txt |
Теперь в директории должно появиться 5 пронумерованных файлов. Выведем эти файлы (точка после означает, что поиск надо проводить в текущей директории; ключ просит выводить только файлы).
find
user test $ |
find . -type f |
Потоковый редактор в команде получает поток названий файлов от find. И с каждым названием файла он может делать какую-то операцию. Нас интересует замена, общий вид которой в выглядит так.
sed
Общий вид команд в редакторе sed:
Если выполнить данные команды, то будет ждать ввода аргументов с клавиатуры. После каждого нажатия Enter выведет строку, заменив в ней ‘old’ на ‘new’, если ‘old’ будет присутствовать в введённой строке. Но обычно sed используется либо в связках типа , либо принимает в качестве аргумента имена файлов, чтобы произвести замены внутри файлов.
Заметьте, что вы сами можете выбирать разделитель — например, , или
(хотя можно использовать почти любой символ), комбинировать их нельзя. Буква ‘s’ — заменить (от англ. substitute);
буква ‘g’ (от англ. global) в конце стоит для того, чтобы замена происходила
во всей строке не только для первого вхождения, а столько раз, сколько там
встретится «old». Когда в заменяемых выражениях встречаются слэши (
или ), то каждую из них приходится предварять дополнительным обратным
слэшем, тогда код слишком сильно напоминает частокол и удобнее использовать
двоеточие или что-то другое в качестве разделителя.
Итак, посмотрим, что мы можем сделать двумя первыми шагами :
user test $ |
find . -type f | sed 's:filename:new:g' |
Отлично, нужные нам имена выведены. Но в третьем шаге утилите нужны и старое, и новое имя файла, чтобы применить к ним команду . Поэтому модифицируем команду :
Знак «p;» (p — print), стоящий перед «s», просит sed выдавать не только результат, но и исходный материал. Теперь вывод будет такой:
user test $ |
find . -type f | sed 'p;s:filename:new:g' |
То, что нужно. Переходим к третьему шагу.
xargs
Программа работает с потоками данных. Утилита принимает один поток и может «распараллелить» его на несколько. Чтобы было лучше понятно, посмотрите простые примеры:
user ~ $ |
echo "1 2 3 4 5 6 7 8 9" |
user ~ $ |
echo "1 2 3 4 5 6 7 8 9" | xargs -n1 |
user ~ $ |
echo "1 2 3 4 5 6 7 8 9" | xargs -n2 |
user ~ $ |
echo "1 2 3 4 5 6 7 8 9" | xargs -n3 |
user ~ $ |
echo "1 2 3 4 5 6 7 8 9" | xargs -n4 |
Для переименования файлов, очевидно, нам нужен ключик , тогда разделит поток из старых и новых имён в две колонки.
user test $ |
find . -type f | sed 'p;s:filename:new:' | xargs -n2 |
Отлично. Осталось перед каждой парой вставить , и переименование произойдёт. Выполняем:
user test $ |
find . -type f | sed 'p;s:filename:new:' | xargs -n2 mv |
Вывода никакого не последует, но переименование произошло. Чтобы быть уверенным в результате, можно произвести проверку перед выполнением этой команды. Для этого надо добавить ключ к . Тогда утилита будет показывать, что она сделала бы без ключа . Можно нажимать Enter и просматривать, что собирается сделать команда. Изменения применены не будут.
user test $ |
find . -type f | sed 'p;s:filename:new:' | xargs -n2 -p mv |
Если результаты устраивают, то нужно убрать ключ и повторить команду.
Специальное копирование файлов в Linux с помощью tar
Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д
важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации
Утилита cp тоже может справиться с такой задачей? если указать опцию -p, но можно использовать утилиту архивации tar. Мы не будем создавать никаких файлов архивов, а построим туннель. Первая часть команды пакует файл и отправляет на стандартный вывод, а другая сразу же распаковывает в нужную папку:
Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.
GUI
Графический интерфейс во многом облегчает жизнь новичкам, которые только установили дистрибутив Linux. Данный метод поиска очень похож на тот, что осуществляется в ОС Windows, хотя и не может дать всех тех преимуществ, что предлагает «Терминал». Но обо всем по порядку. Итак, рассмотрим, как сделать поиск файлов в Linux, используя графический интерфейс системы.
Способ 1: Поиск через меню системы
Сейчас будет рассмотрен способ поиска файлов через меню системы Linux. Проводимые действия будут выполняться в дистрибутиве Ubuntu 16.04 LTS, однако инструкция общая для всех.
Допустим, вам необходимо найти в системе файлы под именем «Найди меня», также этих файлов в системе два: один в формате «.txt», а второй — «.odt». Чтобы их отыскать, необходимо изначально нажать на иконку меню (1), и в специальном поле для ввода (2) указать поисковый запрос «Найди меня».
Отобразится результат поиска, где будут показаны искомые файлы.
Но если в системе было бы много таких файлов и все они отличались расширениями, то поиск бы усложнился. Для того чтобы исключить в выдаче результатов ненужные файлы, например, программы, лучше всего воспользоваться фильтром.
Расположен он в правой части меню. Фильтровать вы можете по двум критериям: «Категории» и «Источники». Разверните эти два списка, нажав по стрелочке рядом с названием, и в меню уберите выделения с ненужных пунктов. В данном случае разумнее будет оставить лишь поиск по «Файлы и папки», так как мы ищем именно файлы.
Сразу можно заметить недостаток этого способа — нельзя детально настроить фильтр, как в «Терминале». Так, если вы ищите текстовый документ с каким-то названием, в выдаче вам могут показать картинки, папки, архивы и т. п. Но если вы знаете точное наименование нужного файла, то сможете быстро отыскать его, не изучая многочисленные способы команды «find».
Способ 2: Поиск через файловый менеджер
Второй способ имеет существенное преимущество. Используя инструмент файлового менеджера, можно произвести поиск в указанном каталоге.
Выполнить данную операцию проще простого. Вам необходимо в файловом менеджере, в нашем случае Nautilus’е, войти в папку, в которой предположительно находится искомый файл, и нажать кнопку «Поиск», расположенную в верхнем правом углу окна.
В появившееся поле для ввода вам нужно ввести предполагаемое название файла. Также не забывайте, что поиск может быть проведен не по целому имени файла, а лишь по его части, как показано на примере ниже.
Как и в предыдущем способе, в этом точно так же можно использовать фильтр. Для его открытия нажмите на кнопку со знаком «+», расположенную в правой части поля ввода поискового запроса. Откроется подменю, в котором вы можете из выпадающего списка выбрать искомый тип файла.
10 примеров команд find в Linux
Команда Linux find является очень мощным. Она может производить поиск по всей файловой системе, чтобы найти файлы или каталоги в соответствии с критериями поиска, которые вы укажете. В этой статье я покажу 10 примеров команд Linux для поиска, которые будут очень полезны для новичков и экспертов.
1. Найти файлы, используя имя
# find /etc -name passwd
# find /etc -name passwd
Допустим у меня есть веб сервер и все мои файлы (HTML, php) лежат в директории /var/www/, в которую я уже перешел. Мне нужно найти файлы которые не открывались (не изменялись) около 1 месяца после поиска нужно положить (скопировать) ссылки на данные файлы в директорию /var/www/my_test_domain:
# find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 \ -exec ln {} /var/www/my_test_domain \;
2. Найти файлы, используя имя с учетом регистра
# find /etc -iname Passwd
find /etc -iname Passwd
3. Найти файлы в зависимости от типа файлов
Найти только файлы сокетов:
# find . -type s
Найти все каталоги:
# find . -type d
Найти только обычные файлы:
# find . -type f
4. Найти файлы по времени последней модификации
# find . -mtime -7
find . -mtime -7
5. Поиск файлов по размеру
Найти файлы больше, чем 200 мб:
# find /var -size +200M
Найти файлы, размер которых меньше 50 мб:
# find /var -size -50M
6. Найти файлы, используя разрешение
# find /var -perm 777
7. Поиск и удаление
Удалить PHP файлы можно следующим образом:
# find . -iname "*.php" -exec rm -rf {} \;
или
# find . -iname "*.php" -print | xargs rm –f
8. Найти все пустые файлы
# find /var -empty
9. Поиск файлов только в текущем каталоге, не искать у вложенных каталогов этой директории:
# find /etc -maxdepth 1 -name passwd
10. Найти файлы с различными расширениями
# find / -type f \( -name "*.php" -o -name "*.php5" \)
Скопировать все файлы которые имеют расширение *.txt в файлы с соответствующим началом *.new.txt (например был файл file_1.txt, а нужно чтобы стал file_1.new.txt):
# find /home/captain/src/ | xargs -l -I{} sh -c 'a={}; cp $a 'echo $a | sed 's/txt$/new.txt/'' # find | xargs -l -I{} sh -c 'a={}; cp $a `basename $a .txt`.new.txt'
Это я нашел в интернете, но оно у меня не работало, оставил, может кто то поправит.
Я написал скрипт следующего содержания:
# vim /home/captain/cp.sh
#!/bin/sh for i in `find /home/captain/src/ -iname "*.txt"` do NAME=`echo "$i" | sed 's/\.txt/new.txt/'` cp $i $NAME done
И еще одна версия:
# for i in *.txt; do cp ${i} ${i%.*}.new.${i#*.} ; done
Тема «10 примеров команд find в Linux» озвучена и так же описана, на этом я закончу.
Найти файлы по типу
Иногда вам может потребоваться поиск определенных типов файлов, таких как обычные файлы, каталоги или символические ссылки. В Linux все является файлом.
Для поиска файлов по их типу используйте параметр и один из следующих дескрипторов, чтобы указать тип файла:
- : обычный файл
- : каталог
- : символическая ссылка
- : символьные устройства
- : блочные устройства
- : именованный канал (FIFO)
- : сокет
Например, чтобы найти все каталоги в текущем рабочем каталоге , вы должны использовать:
Типичным примером может быть рекурсивное изменение разрешений файлов веб-сайтов на и разрешений каталогов на с помощью команды :
Поиск файлов через терминал. Команда locate
Команда locate считается устаревшей, т.к. она выполняет поиск не в реальном времени, подобно команде , а только по ранее созданной базе файлов. Вы вводите слово, которое вас интересует, и команда выдает все известные ей файлы, имя которых содержит заданное слово. Команда поддерживает работу с регулярными выражениями. Например, чтобы найти все файлы, в имени которых содержится слово users, необходимо выполнить:
Стоит заметить, что если файл появился в системе уже после создания базы, то он не будет найден.
Иногда вам может потребоваться обновить базу данных, к которой обращается . Для этого необходимо ввести команду (её запуск производится от имени суперпользователя):
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
С теорией покончено, теперь перейдем к практике. Рассмотрим несколько основных примеров поиска внутри файлов Linux с помощью grep, которые могут вам понадобиться в повседневной жизни.
ПОИСК ТЕКСТА В ФАЙЛАХ
В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:
В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:
А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:
ВЫВЕСТИ НЕСКОЛЬКО СТРОК
Например, мы хотим выбрать все ошибки из лог файла, но знаем что в следующей сточке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк, ошибки будем искать в Xorg.log по шаблону «EE»:
Выведет строку с вхождением и 4 строчки после нее.
Выведет целевую строку и 4 строчки до нее
Выведет по две строки с верху и снизу от вхождения.
РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ В GREP
Регулярные выражения grep — очень мощный инструмент в разы расширяющий возможности поиска текста в файлах grep. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:
Поиск вхождения в начале строки с помощью спецсимвола «^», например, выведем все сообщения за ноябрь:
Поиск в конце строки, спецсимвол «$»:
Найдем все строки которые содержат цифры:
Вообще, регулярные выражения grep это очень обширная тема, в этой статье я лишь показал несколько примеров, чтобы дать вам понять что это. Как вы увидели, таким образом, поиск текста в файлах grep становиться еще гибче. Но на полное объяснение этой темы нужна целая статья, поэтому пока пропустим их и пойдем дальше.
РЕКУРСИВНОЕ ИСПОЛЬЗОВАНИЕ GREP
Если вам нужно провести поиск текста grep в нескольких файлах, размещенных в одном каталоге или подкаталогах, например, в файлах конфигурации Apache — /etc/apache2/ — используйте рекурсивный поиск. Для включения рекурсивного поиска в grep есть опция -r. Следующая команда займется поиском текста в файлах Linux во всех подкаталогах /etc/apache2 на предмет вхождения строки mydomain.com:
В выводе вы получите:
Здесь перед найденной строкой указано имя файла в котором она была найдена. Вывод имени файла легко отключить с помощью опции -h:
ПОИСК СЛОВ В GREP
Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить grep искать по содержимому файлов в linux только те строки, которые выключают искомые слова с помощью опции -w:
ПОИСК ДВУХ СЛОВ
Можно искать по содержимому файла не одно слово, а целых несколько. Чтобы искать два разных слова используйте команду egrep:
КОЛИЧЕСТВО ВХОЖДЕНИЙ СТРОКИ
Утилита Grep может сообщить сколько раз определенная строка была найдена в каждом файле. Для этого используется опция -c (счетчик):
C помощью опции -n можно выводить номер строки в которой найдено вхождение, например:
Получим:
ИНВЕРТИРОВАННЫЙ ПОИСК В GREP
Команда grep linux может быть использована для поиска строк в файле Linux которые не содержат указанное слово. Например, вывести только те строки, которые не содержат слово пар:
ВЫВОД ИМЕНИ ФАЙЛА
Вы можете указать grep выводить только имя файла в котом было найдено заданное слово с помощью опции -l. Например, следующая команда выведет все имена файлов, при поиске по содержимому которых было обнаружено вхождение primary:
Синтаксис команды find
Общий синтаксис команды find, который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:
Путь
В качестве пути для поиска можно использовать как абсолютные, так и относительные пути, а также список путей, разделенных пробелом.
Опции
Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.
-depth (или -d) | Поиск в подкаталогах перед поиском в самом каталоге. |
-L | При поиске следовать по символическим ссылкам. |
-maxdepth N | При поиске проверять не более чем N вложенных уровней каталогов. |
-mindepth N | Не проверять вложенные каталоги уровня N и меньше. |
-mount | Не искать в каталогах других файловых систем. |
Критерии поиска
У команды find может быть несколько критериев поиска (их также называют tests). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false. Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false, тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.
-atime N | Последний раз к файлу обращались N дней назад. |
-mtime N | Последнее изменение файла было N дней назад. |
-name шаблон | Имя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки. |
-newer другой_файл | Файл был изменен позже, чем другой_файл. |
-size N | Размер файла равен N блокам, если указано +N, тогда размер файла больше N, -N — меньше. Символ после N означает размер блока. b — 512 байт, с — байт, w — 2 байта, k — килобайт, M — мегабайт, G — гигабайт. |
-type C | Файл типа C. Наиболее часто используемые значения для С: d — каталог, f — файл. |
-user Имя_пользователя | Файл принадлежит пользователю с именем Имя_пользователя. |
Примеры использования команды 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) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).
Действия над файлами
Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.
-exec команда \;
Выполнить команду
Обратите внимание, что после команды ставится обратный слеш и точка с запятой.
-execdir команда \;
То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл.
-ok команда \;
То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды.
-okdir команда \;
То же что ok для execdir.
-print
Вывод имени файла на экран.
-ls
Выполнение команды ls -dils над текущим файлом.. В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу
В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.
Примеры использования команды find с использованием действий
Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).
Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).
Поиск через графический интерфейс
Главное меню
С помощью главного меню ОС вы можете не только искать и запускать программы, но также и выполнять поиск файлов. Подобный функционал присутствует во многих окружениях рабочего стола (, , и пр.). Например, в KDE это представлено следующим образом:
При этом стоит отметить, что такой вариант поиска ориентирован больше на поиск программ, нежели на поиск файлов, поэтому выполняется он только в домашнем каталоге и не уходит вглубь файловой системы.
Файловые менеджеры
Многие файловые менеджеры также предоставляют возможности поиска файлов. Например, в Dolphin для запуска поиска достаточно просто нажать кнопку со значком лупы, а затем ввести имя файла (или папки) в строку поиска. При этом вы можете выбрать папку, в которой будет выполняться поиск, а также указать дополнительные параметры (поиск по содержимому и пр.). Помимо этого в качестве поискового запроса допускается применять символы и :
Поиск по содержимому в Dolphin:
KFind
В KDE, помимо вышеупомянутых инструментов поиска, также есть замечательная утилита под названием KFind. С её помощью вы можете точно настроить параметры поиска (указать имя файла, его тип и путь поиска, обычный текстовый поиск или мета-поиск, дату изменения, размер, пользователя, группу и пр.). Она также позволяет сохранять результаты поиска в виде простого текстового списка URL-адресов найденных файлов:
SearchMonkey
SearchMonkey позволяет выполнять поиск файла, как по имени, так и по его содержимому, по диапазону дат и пр. Но главное преимущество SearchMonkey — это возможность везде применять регулярные выражения.
Поиск с применением регулярного выражения в SearchMonkey:
Recoll
Recoll — это приложение (поисковый движок) для полнотекстового поиска, выполняющее поиск ваших данных по содержимому, а не по внешним атрибутам (например, по имени файла). Вам не нужно запоминать, в каком файле или сообщении электронной почты вы хранили ту или иную информацию. Необходимо лишь указать слова (или выражения), которые должны или не должны присутствовать в искомом тексте, и взамен вы получите список соответствующих документов, упорядоченных таким образом, что первыми идут наиболее релевантные из них (подобно поисковым системам Интернета).
Установить программу можно из официальных репозиториев через командную строку:
Или через графический интерфейс:
Сразу же после запуска утилита предложит вам создать индекс документов, которые присутствуют в вашем домашнем каталоге. После создания индекса вы сможете выполнять по нему поиск. Для этого достаточно ввести какой-нибудь запрос, например, , и вы увидите все файлы, которые содержат это слово с примерами вхождений, отсортированные по релевантности:
Это может быть очень удобно при работе с большим объемом текстовых данных. Программа поддерживает такие форматы файлов, как: .pdf, .djvu, .doc, .docx, .odf. А также умеет находить перечисленные файлы в архивах.
Копирование файлов по регулярным выражениям в Linux
В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:
Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ {} — подставляет имя каждого файла.
Но не find’ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:
Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.
Примеры использования команды locate.
Давайте найдем все файлы с расширением .exe:
Если мы хотим вывести результаты поиска в одну строку, тогда используем следующую опцию -0 (это тире и ноль)
Вот результат:
Но если мы ищем файл с названием «file», то не найдутся файлы с именами в другом регистре: File, FILE и т.д.
Чтобы поиск сделать регистронезависимым, то нужно использовать следующую опцию -i, то есть:
Если мы хотим узнать просто количество файлов, имеющих в имени «file», или количество файлов с определенным расширением, к примеру .exe, то нужно указать опцию -c:
Что означает, что в системе 10 файлов имеют расширение .exe.
Если мы хотим ограничить число выводимых файлов в поиске по заданному параметру, мы ставим опцию -n и число:
То есть, данная команда с опцией -n 2 выведет нам только 2 первых найденных файла:
И напоследок, locate лучше выполнять с опцией -e, тогда будут отображены файлы, которые существуют в системе. Даже тогда, когда запись о файле находится в базе данных, все равно будет осуществлена проверка физического нахождения файла в системе:
Полезные команды whereis и which.
У нас установлены программы в системе и чтобы узнать размещение бинарных файлов, исходных кодов и руководств, относящихся к установленной программе, можно выполнить команду whereis. Для примера найдем информацию о пакете google-chrome:
Команда же which отображает полный путь к установленной программе. Также в качестве примера возьмем google-chrome:
Результат выполнения данных команд:
Управление процессами
Команда top
Команда top отображает в режиме реального времени список запущенных процессов, их числовые идентификаторы (сокр. «PID» от англ. Process IDentificator») и насколько сильно каждый из них нагружает CPU:
Команда kill
Если у вас есть зависшая программа, то вы можете вручную завершить её работу, послав с помощью команды kill соответствующий сигнал.
Всего существует 64 различных сигнала, но самыми популярными являются два:
SIGTERM (15) — сигнал завершения работы программы, при котором ей дается некоторое время, чтобы сохранить свой прогресс и данные.
SIGKILL (9) — сигнал, требующий от программы немедленного завершения. Все несохраненные данные при этом будут потеряны.
Например, зная PID нужного вам процесса, послать ему сигнал можно следующим образом:
В этом примере параметр отвечает за сигнал SIGKILL (9), а — это идентификатор (PID) нужного вам процесса.