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.
Читайте также: