Они оба работают. Однако лично я предпочел бы:
45 * * * mon script.sh
Так как это более читабельно и понятно без необходимости запоминать, какой день недели равен «1».
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
Чтобы перечислить имена в одном каталоге (, т. е. не рекурсивно ), которые содержат не менее трех символов, вы можете использовать любой из шаблонов подстановки *???
, ???*
или *???*
. Каждый ?
соответствует одному символу, а *
соответствует любому количеству символов.
Чтобы перечислить такие имена в /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
).
Связанные:
Вы можете использовать find
и фильтр для результата:
find -type f | egrep '3$|4$|5$'