найти каталог или файл, оканчивающийся на любые 3 символа

Они оба работают. Однако лично я предпочел бы:

45 * * * mon script.sh

Так как это более читабельно и понятно без необходимости запоминать, какой день недели равен «1».

-1
30.09.2019, 05:28
3 ответа
find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3}$'

Это позволит найти в /etc/имена файлов или каталогов длиной ровно 3 символа.

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,}$'

И это найдет файлы или каталоги в /etc/, которые имеют минимальную длину 3 символа.

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$'

И это найдет файлы или каталоги в /etc, которые имеют длину от 3 до 7 символов.

Параметр -maxdepth 1предотвращает поиск подкаталогов -каталога /etc.

Если вы хотите ограничить поиск только каталогами, добавьте -type dпосле -maxdepth 1. Для обычных файлов используйте -type f.

Если вы собираетесь что-то делать с найденными файлами/каталогами, вы можете использовать опцию find -exec. например.

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -exec du -sch {} +

или xargs(, но используйте разделители NUL, чтобы избежать проблем с пробелами, новыми строками и т. д. в именах файлов ). Это позволяет вам использовать любой инструмент, который может обрабатывать ввод, разделенный NUL -, в конвейере до xargs. например.:

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -print0 | 
  head -z -n 10 |
  xargs -0r ls -ld
2
28.01.2020, 05:07

Чтобы перечислить имена в одном каталоге (, т. е. не рекурсивно ), которые содержат не менее трех символов, вы можете использовать любой из шаблонов подстановки *???, ???*или *???*. Каждый ?соответствует одному символу, а *соответствует любому количеству символов.

Чтобы перечислить такие имена в /etcс помощьюls:

ls -ld /etc/*???

или просто

printf '%s\n' /etc/*???

Если вы хотите перечислить имена, которые заканчиваются тремя определенными символами (, например. xyz), затем используйте *xyzв качестве шаблона.

Для рекурсивного поиска таких имен вы можете (вbash)использовать shopt -s globstar, чтобы включить **шаблон подстановки (для рекурсивного поиска в подкаталогах ), а затем...

ls -ld /etc/**/*???

Шаблон **включен по умолчанию в оболочке zsh.

Чтобы сделать что-нибудь с этими именами (, кроме простого вызова ls), используйте цикл:

shopt -s globstar
for pathname in /etc/**/*???; do
    # use "$pathname" to do something
done

В оболочке dashили простом shэквивалентом этого цикла будет

find /etc -name '*???' -exec sh -c '
    for pathname do
        # use "$pathname" to do something
    done' sh {} +

Связанные:


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

Шаблоны имен файлов также всегда привязаны, поэтому нет необходимости явно привязывать шаблон с помощью $, поскольку в регулярном выражении (шаблон должен соответствовать полному имени файла, поэтому xyzточно соответствует этому имени, в то время как *xyzсоответствует любому имени файла, оканчивающемуся на xyz).

Связанные:

1
28.01.2020, 05:07

Вы можете использовать findи фильтр для результата:

find -type f | egrep '3$|4$|5$'
0
28.01.2020, 05:07

Теги

Похожие вопросы