Поиск файлов: шаблоны и find
Данные часто лежат во многих файлах: по одному на день или месяц. Шаблоны помогают работать со всеми файлами сразу. find помогает найти файл, если вы не помните, где он.
Шаблоны (wildcards)
Заголовок раздела «Шаблоны (wildcards)»Shell сам превращает шаблон в список подходящих имён. Это происходит до запуска команды.
| Шаблон | Что подходит | Пример |
|---|---|---|
* | Любые символы, сколько угодно | sales_*.csv — все файлы продаж |
? | Ровно один любой символ | sales_2024-0?.csv — месяцы с 01 по 09 |
[ ] | Один символ из списка | sales_2024-0[12].csv — январь и февраль |
ls data/*.csv # все CSV в папке datawc -l data/sales_*.csv # строки во всех файлах продажcp data/sales_*.csv /tmp/ # скопировать все файлы продажШаблон * не находит скрытые файлы. ls inbox/* не покажет inbox/.env.
find — найти файл
Заголовок раздела «find — найти файл»find ищет по всему дереву папок:
find . -name "*.log" # все .log в текущей папке и нижеfind ~ -name "profiles.yml" # где лежит конфиг dbtfind . -type d # только папкиfind . -type f -size +100k # файлы больше 100 КБfind . -empty # пустые файлы и папки- Первый аргумент — где искать.
.— текущая папка. - Шаблон в
-nameпишите в кавычках. Иначе shell раскроет*раньше, чемfindего увидит.
du — сколько места занимает
Заголовок раздела «du — сколько места занимает»du -sh data # размер папки datadu -sh * # размер каждой папки и файла здесьТак ищут, что заняло весь диск на сервере.
Практика
Заголовок раздела «Практика»Все задания — в папке ~/cli-practice.
Задание 1
Заголовок раздела «Задание 1»Выведите список только файлов продаж из папки data одним шаблоном.
Проверка:
data/sales_2024-01.csvdata/sales_2024-02.csvdata/sales_2024-03.csvРешение
ls data/sales_*.csvЗадание 2
Заголовок раздела «Задание 2»Выведите только файлы продаж за январь и февраль. Используйте [ ].
Проверка: два файла, sales_2024-01.csv и sales_2024-02.csv.
Решение
ls data/sales_2024-0[12].csvЗадание 3
Заголовок раздела «Задание 3»Найдите все файлы логов (.log) во всех папках.
Проверка: три файла. Порядок может быть другим.
./logs/pipeline.log./logs/archive/pipeline_2024-01.log./logs/archive/pipeline_2024-02.logРешение
find . -name "*.log"Задание 4
Заголовок раздела «Задание 4»Сколько всего CSV-файлов в cli-practice, во всех папках? Передайте вывод find в wc -l.
Проверка: 8.
Решение
find . -name "*.csv" | wc -lЗадание 5
Заголовок раздела «Задание 5»Найдите файлы больше 100 КБ. Потом найдите все пустые файлы и папки.
Проверка: большой файл один — ./data/events.csv. Пустые: три файла tmp_export_0*.bak и папка inbox/old.
Решение
find . -type f -size +100kfind . -emptyЗадание 6
Заголовок раздела «Задание 6»Какая папка в cli-practice занимает больше всего места?
Проверка: data, около 380 КБ. Точные числа зависят от файловой системы.
Решение
du -sh *Дальше: grep и конвейеры.