Вопрос или проблема
Допустим, мне нужно отфильтровать все имена моих файлов, которые не содержат специальных символов. Регулярное выражение должно фильтровать только имена файлов, содержащие буквы и цифры.
ASDA123fasf - пройдет
asasdasd*dasd - не пройдет
Представьте, что я выполняю ls
, и хочу получить только имена папок с буквами и цифрами. ASAS23123fasf
пройдет, 123123fas
тоже пройдет, но asdads&*!@213
не должно пройти.
Одним из многих альтернативных вариантов будет find . -maxdepth 1 -iregex '.*/[a-z0-9.]*' -ls
Если вы думаете, что вам может понадобиться использовать это часто, вы даже можете создать псевдоним для сокращения команды:
Примечание: Ниже приведенный псевдоним будет работать только в текущем каталоге, хотя вы могли бы легко создать скрипт, который будет разбирать аргумент командной строки для каталога.
alias myls="find . -maxdepth 1 -iregex '.*/[a-z0-9.]*' -ls"
Если бы вы это сделали, каждый раз, когда вы вводите команду myls
, вы бы получали желаемый вывод без лишнего ввода. Ленивый или эффективный, решайте сами.
Источники:
Комментарий Byte Commander здесь
https://stackoverflow.com/questions/4509624/how-to-limit-depth-for-recursive-file-list – в частности этот ответ
man find
Ответ или решение
Как фильтровать имена файлов с помощью регулярных выражений (исключая специальные символы)
Фильтрация имен файлов — это важная задача в управлении файлами, особенно когда необходимо исключить те файлы, которые содержат специальные символы. Регулярные выражения (regex) являются мощным инструментом для этой цели. В этом руководстве мы рассмотрим, как использовать регулярные выражения в командной строке для фильтрации имен файлов так, чтобы останавливаться только на тех, что содержат буквы и цифры.
Условия задачи
Ваша задача — отфильтровать имена файлов, чтобы оставлять только те, которые включают буквы и цифры, исключая любые специальные символы. Например:
- Проходят фильтр:
ASDA123fasf
,ASAS23123fasf
,123123fas
- Не проходят фильтр:
asasdasd*dasd
,asdads&*!@213
Решение с использованием команды find
Для решения данной проблемы можно использовать команду find
с регулярным выражением. В вашем примере была представлена команда:
find . -maxdepth 1 -iregex '.*/[a-z0-9.]*' -ls
Однако данное регулярное выражение требует небольшого уточнения, чтобы исключать специальные символы более эффективно. Лучше использовать следующее:
find . -maxdepth 1 -type d -regex '.*/[a-zA-Z0-9]*'
Здесь:
.*/
— соответствует пути к файлу, содержащему любые символы до последнего/
.[a-zA-Z0-9]*
— соответствует именам, состоящим только из букв (как строчные, так и прописные) и цифр.
Объяснение компонентов команды
.
— текущая директория.-maxdepth 1
— ограничивает глубину поиска до текущей директории, исключая подкаталоги.-type d
— указывает, что следует искать только каталоги (по аналогии, можно использовать-type f
для обычных файлов).-regex
— позволяет использовать регулярные выражения для фильтрации имен файлов.-ls
— выводит результаты в виде списка, аналогично командеls
.
Создание алиаса
Если вам часто требуется выполнять эти команды, вы можете создать алиас для упрощения ввода. Для этого добавьте следующую строку в файл конфигурации вашей оболочки (например, .bashrc
или .zshrc
):
alias myls="find . -maxdepth 1 -type d -regex '.*/[a-zA-Z0-9]*'"
После этого, каждый раз, когда вы будете вводить команду myls
, вы будете получать имена каталогов, которые соответствуют заданным условиям, без необходимости повторять длинную команду.
Заключение
Использование регулярных выражений в команде find
— это простое и эффективное решение для фильтрации имен файлов, исключая специальные символы. Создание алиаса для часто используемой команды не только сэкономит ваше время, но и улучшит эффективность работы с файлами.
Помните, что регулярные выражения являются мощным инструментом, и их можно использовать для решения различных задач, связанных с обработкой строк и файлов. Если вам нужно изучить основные принципы работы с регулярными выражениями, вы можете спокойно обратиться к документации (man find
) или другим онлайн-ресурсам, связанным с синтаксисом regex.
Использование сочетания командной строки и регулярных выражений позволяет значительно упрощать рутинные задачи управления файлами, обеспечивая при этом гибкость и мощность инструментов Linux.