Раздел вопрос-ответ Найти и показать только название директорий начинающихся на цифры

Найти и показать только название директорий начинающихся на цифры

share

1 ответ

Давайте создадим себе несколько директорий, чтобы затем командой find найти все директории, которые начинаются с цифры.

Создание директорий для тест-кейса

Итак, создадим n директорий в каталоге dirs.

mkdir -p dirs/{1,2,31,1d,2d/{1subdir,2,start-with-digit},n3,jeka,by,1by,88,u6u,dir,search/{sub,2subdir}}

Создадим еще несколько файлов, чтобы усложнить задачу поиска каталогов:

touch dirs/{10..13}.file
touch dirs/{21,33,string}.txt

Для создания "тестовых" директорий и файлов мы использовали:

{} - brace expansion. Возможность в bash, которая позволяет емко описывать произвольные комбинации строк, может комбинироваться с wildcard.

Давайте проверим что у нас получилось на данный момент по структуре:

% mkdir -p dirs/{1,2,31,1d,2d/{1subdir,2,start-with-digit},n3,jeka,by,1by,88,u6u,dir,search/{sub,2subdir}}
% touch dirs/{10..13}.file
% touch dirs/{21,33,string}.txt
% tree dirs
dirs
├── 1
├── 10.file
├── 11.file
├── 12.file
├── 13.file
├── 1by
├── 1d
├── 2
├── 21.txt
├── 2d
│   ├── 1subdir
│   ├── 2
│   └── start-with-digit
├── 31
├── 33.txt
├── 88
├── by
├── dir
├── jeka
├── n3
├── search
│   ├── 2subdir
│   └── sub
├── string.txt
└── u6u

19 directories, 7 files

Expected data

Как видно по выводу утилиты tree, в директории dirs из представленных директорий только следующие директории начинаются с цифры, следовательно, только их мы и хотим показать:

1by
1
88
31
2d
1d
2

Напишем команду для поиска директорий, начинающихся с цифры на bash с использованием unix утилиты find

Найти и показать только название директорий начинающихся на цифры - find

Ниже рассмотрим подробней, что сделали на скриншоте.

Зайдем в директорию, в которой хотим делать поиск, затем воспользуемся утилитой find.

cd dirs

find . найдет всё (и директории и файлы), которые есть в текущей директории:

% find .
.
./13.file
./12.file
./by
./1by
... #many other...
./string.txt

Давайте сокращать вывод, добавив regex для матчинга имен, начинающихся с цифры:

% find . -regex './[0-9].*'

% find . -regex './[0-9].*'
./13.file
./12.file
./1by
./1
./88
./31
./21.txt
./11.file
./2d
./2d/1subdir
./2d/start-with-digit
./2d/2
./33.txt
./10.file
./1d
./2

Уже лучше!

  • Давайте заставим find искать только в текущей директории, игнорируя поддиректории, добавив опцию: -maxdepth 1.
  • Давайте добавим опцию в find чтобы искать только директории, игнорируя файлы: -type d.

Добавив оба флага в find, получаем следующий вывод директорий первого уровня:

find . -regex './[0-9].*' -maxdepth 1 -type d

% find . -regex './[0-9].*' -maxdepth 1 -type d
./1by
./1
./88
./31
./2d
./1d
./2

То, что нужно! Теперь приукрасим вывод директорий, убрав из имени директории вот эту часть пути "./". Опция execdir поможет сделать этот "трюк":

-execdir echo {} ';'

% find . -regex './[0-9].*' -maxdepth 1 -type d -execdir echo {} ';'
1by
1
88
31
2d
1d
2

Готово, итого финальная команда поиска имен директорий, начинающихся с цифры:

find . -regex './[0-9].*' -maxdepth 1 -type d -execdir echo {} ';'

Данный вариант подходит для поиска директорий внутри конкретной директории, без рекурсивного поиска.

Добавить комментарий
    как минимум 5 символов

    icon Вход в систему

    зарегистрироваться
    НОВЫЕ ПОЛЬЗОВАТЕЛИ