Показать все файлы, которые начинаются с 3 цифр

Мне нужно найти все файлы в корневом каталоге, которые начинаются с 3 цифр, и использовать команду find, до сих пор я пробовал с find . -type f -name '[[digit]]'*' | grep -E '.*/[100-999]+$', но это показывает совершенно другой результат. Что я делаю не так? Что мне делать, чтобы получить правильный результат? Пожалуйста помоги


person Maciek738    schedule 25.05.2021    source источник
comment
Что делать, если имя файла начинается с четырех цифр? [100-999] равно [0-9], и ваше регулярное выражение требует, чтобы имя файла содержало только одну или несколько цифр.   -  person Wiktor Stribiżew    schedule 25.05.2021
comment
спасибо, совершенно неверно истолковал использование этого   -  person Maciek738    schedule 25.05.2021
comment
Maciek, пожалуйста, проверьте ответ ниже, и если он работает для вас, рассмотрите возможность принятия ответа. Вы также получите 2 балла за принятие.   -  person Wiktor Stribiżew    schedule 28.05.2021


Ответы (1)


Обратите внимание, что [100-999] равно [0-9], и ваше регулярное выражение требует, чтобы имя файла содержало только одну или несколько цифр. Кроме того, вы пропустили двоеточие в определении класса символов POSIX, [[digit]] должно выглядеть как [[:digit:]], если вы планируете сопоставлять цифру в шаблоне glob -name.

Если вы хотите найти файлы с именем, начинающимся с 3 цифр (а дальше может быть что угодно, в том числе и больше цифр), вы можете использовать

find . -type f -name '[[:digit:]][[:digit:]][[:digit:]]*'
find . -type f -name '[0-9][0-9][0-9]*'
find . -type f -regextype posix-extended -regex '.*/[0-9]{3}[^/]*$'

Примечание:

  • find . -type f -name '[[:digit:]][[:digit:]][[:digit:]]*' или find . -type f -name '[0-9][0-9][0-9]*' - здесь шаблон имени представляет собой шаблон глобуса, который соответствует полному имени файла, поэтому он должен начинаться с 3 цифр, а затем подстановочный знак * соответствует любому тексту до конца имени файла.
  • find . -type f -regextype posix-extended -regex '.*/[0-9]{3}[^/]*$' - если вы предпочитаете играть с регулярным выражением или расширять в будущем - он соответствует любому тексту до последнего /, а затем 3 цифры и любой текст, кроме /, до конца строки. Если в начале может быть только три, а не четыре цифры, нужно
find . -type f -regextype posix-extended -regex '.*/[0-9]{3}([^0-9][^/]*)?$'

Здесь,

  • .*/ — соответствует последнему / символу, включая его
  • [0-9]{3} - любые три цифры
  • ([^0-9][^/]*)? - необязательное вхождение нецифры, а затем ноль или более символов, отличных от /
  • $ - конец строки.
person Wiktor Stribiżew    schedule 25.05.2021
comment
Любопытно насчет [[:digit:]], есть ли оболочка, которая не поддерживает [0-9]? - person Sundeep; 25.05.2021
comment
Кроме того, вы можете упростить [0-9]{3}([^0-9][^/]*)?$ до [0-9]{3}[^0-9/]*$ - person Sundeep; 25.05.2021
comment
@Sundeep Нет, [0-9]{3}[^0-9/]*$ не будет соответствовать 123-good-name01.txt - person Wiktor Stribiżew; 25.05.2021
comment
О, хорошее замечание... квантификатор притяжательности сделал бы это проще... - person Sundeep; 25.05.2021
comment
Еще раз хороший момент, я только что попробовал то, что, как я думал, сработает, но не сработало (хотя поиск помогает). Я думаю, что [^0-9] должно быть [^0-9/], иначе ./123/-good-name01.txt будет соответствовать - person Sundeep; 26.05.2021
comment
Просто перефразируя предыдущий комментарий, который я удалил: я сомневаюсь, что здесь необходим притяжательный квантификатор. Вот хороший вариант использования притяжательного квантификатора. - person Wiktor Stribiżew; 28.05.2021