Linux найти и скопировать файлы

Обновлено: 01.07.2024

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

Часто ипользуется как первый шаг перед копированием, перемещением, удалением, изменением файлов, соответсвующих определённым условиям.

Поиск

Найти и вывести на экран все файлы в директории

find
find .
find . -print

-name: Поиск по имени

Найти по полному имени в текущей директории

Если регистр не важен

Поиск по расширению

Найти по расширению файла с помощью wildcard *

-not: обратное условие

Найти в текущей директории все файлы кроме php

Несколько условий вместе

Найти все файлы, которые начинаются с log но не имеют расширения .txt

-o: Логическое или

Найти либо .html либо .php файлы

Найти и скопировать

Найти и сразу скопировать в текущую директорию

Найти в текущей директории

Удалить из текущей директории

Поиск по типу

Чтобы найти только файлы определённого типа выполните find с опцией type.

Подробнее о файлах в Linux читайте в статье «Типы файлов в Linux»

Уровни вложенности

Найти все ссылки только на верхнем уровне вложенности

find /etc -maxdepth 1 -type l

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

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

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

Поиск по началу имени файла

Обратите внимание, что в find, в отличие от grep , ставить перед началом названия никаких символов не нужно.

Поиск по части имени файла

Найти в проекте topbicyle все директории с qa в названии

Переместить определённые файлы но не директории

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

-perm: поиск по правам доступа

-path: поиск путей

find . -path "./code/p*"

Пример укороченного результата

-prune: ограничить глубину

Если нужно посмотреть только поддиректории верхнего уровня - используется -prune

find . -path "./code/p*" -prune

Получили только поддиректории без их содержимого

Исключить директорию из поиска

Из предыдущего параграфа понятно, что с помощью prune можно исключить директорию из поиска.

find ./code -path "./code/p*" -prune -false -o -name "*index.php"

./code/js/errors/index.php ./code/js/index.php ./code/c/index.php ./code/cpp/index.php ./code/go/pointers/index.php ./code/go/declare_variable/index.php ./code/go/constants/index.php ./code/go/index.php ./code/java/index.php ./code/dotnet/index.php ./code/ruby/index.php ./code/theory/index.php ./code/index.php

-false нужен чтобы не выводить проигнорированные директории.

Ещё один способ исключить директорию из поиска

find ./code -name "*.php" -not -path "./code/p*"

find + sed

К результатам команды find можно сразу же применить sed

. означает, что ищем в текущей директории (и вложенных)

Эта команда заменяет везде

Если нужно не найти или заменить строку а показать название файла, в котором есть определённые символы - удобно воспользоваться связкой find + grep

Добавить в функцию my_function дополнительный аргумент - сразу в всех .php файлах.


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

Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:

  • Дате добавления.
  • Содержимому.
  • Регулярным выражениям.

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

  • Управления дисковым пространством.
  • Бэкапа.
  • Различных операций с файлами.

Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.

Синтаксис команды find:

  • directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
  • criteria (критерий) – критерий, по которым нужно искать файлы;
  • action (действие) – что делать с каждым найденным файлом, соответствующим критериям.

Поиск по имени

Следующая команда ищет файл s.txt в текущем каталоге:

  • . (точка) – файл относится к нынешнему каталогу
  • -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.

В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.

Для поиска всех изображений c расширением .jpg нужно использовать шаблон подстановки *.jpg:

Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:

Поиск по типу файла

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги:

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

Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.

  • "+" — Поиск файлов больше заданного размера
  • "-" — Поиск файлов меньше заданного размера
  • Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.

В данном случае поиск выведет все файлы более 1 Гб (+1G).

Единицы измерения файлов:

Поиск пустых файлов и каталогов

Критерий -empty позволяет найти пустые файлы и каталоги.

Поиск времени изменения

Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:

Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).

Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.

Поиск по времени доступа

Критерий -atime позволяет искать файлы по времени последнего доступа.

Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).

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

Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:

Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.

Поиск по набору разрешений

Критерий -perm – ищет файлы по определенному набору разрешений.

Поиск файлов с разрешениями 777.

Операторы

Для объединения нескольких критериев в одну команду поиска можно применять операторы:

Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:

Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.

Перед скобками нужно поставить обратный слеш "\".

Действия

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

  • -delete — Удаляет соответствующие результатам поиска файлы
  • -ls — Вывод более подробных результатов поиска с:
    • Размерами файлов.
    • Количеством inode.

    -delete

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

    Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.

    Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.

    • command – это команда, которую вы желаете выполнить для результатов поиска. Например:
      • rm
      • mv
      • cp

      С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:

      Другой пример использования действия -exec:

      Таким образом можно скопировать все .jpg изображения в каталог backups/fotos

      Заключение

      Команду find можно использовать для поиска:

      • Файлов по имени.
      • Дате последнего доступа.
      • Дате последнего изменения.
      • Имени пользователя (владельца файла).
      • Имени группы.
      • Размеру.
      • Разрешению.
      • Другим критериям.

      С полученными результатами можно сразу выполнять различные действия, такие как:

      • Удаление.
      • Копирование.
      • Перемещение в другой каталог.

      Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.

      Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

      Общий синтаксис

      find <где искать> <опции>

      <где искать> — путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».

      <опции> — набор правил, по которым выполнять поиск.

      * по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

      Описание опций

      Тип объекта поиска. Возможные варианты:

      • f — файл;
      • d — каталог;
      • l — ссылка;
      • p — pipe;
      • s — сокет.

      Также доступны логические операторы:

      Оператор Описание
      -a Логическое И. Объединяем несколько критериев поиска.
      -o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
      -not или ! Логическое НЕ. Инвертирует критерий поиска.

      Полный набор актуальных опций можно получить командой man find.

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

      Поиск файла по имени

      1. Простой поиск по имени:

      * в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.

      2. Поиск файла по части имени:

      * данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp

      3. Несколько условий.

      а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:

      б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:

      в) Более компактный вид имеют регулярные выражения, например:

      * где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).

      4. Найти все файлы, кроме .log:

      * в данном примере мы воспользовались логическим оператором !.

      Поиск по дате

      1. Поиск файлов, которые менялись определенное количество дней назад:

      find . -type f -mtime +60

      * данная команда найдет файлы, которые менялись более 60 дней назад.

      2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find --version).

      а) дате изменения:

      find . -type f -newermt "2019-11-02 00:00"

      * покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.

      find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02

      * найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).

      б) дате обращения:

      find . -type f -newerat 2019-10-08

      * все файлы, к которым обращались с 08.10.2019.

      find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01

      * все файлы, к которым обращались в октябре.

      в) дате создания:

      find . -type f -newerct 2019-09-07

      * все файлы, созданные с 07 сентября 2019 года.

      find . -type f -newerct 2019-09-07 ! -newerct "2019-09-09 07:50:00"

      * файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50

      По типу

      Искать в текущей директории и всех ее подпапках только файлы:

      * f — искать только файлы.

      Поиск по правам доступа

      1. Ищем все справами на чтение и запись:

      find / -perm 0666

      2. Находим файлы, доступ к которым имеет только владелец:

      find / -perm 0600

      Поиск файла по содержимому

      find / -type f -exec grep -i -H "content" <> \;

      * в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.

      С сортировкой по дате модификации

      * команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.

      Лимит на количество выводимых результатов

      Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:

      Поиск с действием (exec)

      1. Найти только файлы, которые начинаются на sess_ и удалить их:

      find . -name "sess_*" -type f -print -exec rm <> \;

      * -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.

      2. Переименовать найденные файлы:

      find . -name "sess_*" -type f -exec mv <> new_name \;

      3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:

      find . -name "*.tmp" | wc -l

      4. Изменить права:

      find /home/user/* -type d -exec chmod 2700 <> \;

      * в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.

      5. Передать найденные файлы конвееру (pipe):

      * в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.

      6. Произвести замену в файлах с помощью команды sed:

      find /opt/project -type f -exec sed -i -e "s/test/production/g" <> \;

      * находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.

      Чистка по расписанию

      Команду find удобно использовать для автоматического удаления устаревших файлов.

      Открываем на редактирование задания cron:

      0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;

      * в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
      * полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.

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

      Пока ничего умнее не придумал: find /место/искомого/файла -type f -cmin -10 | xargs cp -tpv /мой/каталог/

      Но эт нифига не то что хотелось бы. Гуглил, не помогло особо.



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

      На уроки ходи, неуч!

      Если на коленке и без каталогов, то ls -t|head -n 1 покажет самый новый файл.

      Deleted ( 22.03.19 13:13:33 )
      Последнее исправление: Deleted 22.03.19 13:15:05 (всего исправлений: 1)

      Ох уже эти советчики со звездами.

      ТС, НИКОГДА не используй ls, если вывод нужно использовать где-то еще. ls предназначен не для этого.

      Чтобы получить самый новый файл используй скрипт



      я конечно новичок, но не на столько же))

      мне не надо любоваться его названием, мне надо этот файл выхватить к себе в укровное место, так сказать)

      Если пошагово делать - понятнее становится.


      Что делать пошагово? Пайп не терминал.

      Смотреть результат каждой команды.


      Запихни имя в переменную и используй.

      мне не надо любоваться его названием, мне надо этот файл выхватить к себе в укровное место

      Лечи голову, лечи голову:

      Deleted ( 22.03.19 13:28:58 )
      Последнее исправление: Deleted 22.03.19 13:29:17 (всего исправлений: 1)


      Я не умею смотреть pipe, это разве что через strace.

      А результат ls (во всяком случае GNU) меняется от того, куда направлен вывод, в доке про это написано.

      Вывод $ ls -t > /tmp/tmpfile && cat /tmp/tmpfile
      в общем случае совпадёт с выводом $ ls -t

      Я не умею смотреть pipe, это разве что через strace.

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