Мне нужно найти все файлы в корневом каталоге, которые начинаются с 3 цифр, и использовать команду find, до сих пор я пробовал с find . -type f -name '[[digit]]'*' | grep -E '.*/[100-999]+$'
, но это показывает совершенно другой результат. Что я делаю не так? Что мне делать, чтобы получить правильный результат? Пожалуйста помоги
Показать все файлы, которые начинаются с 3 цифр
Ответы (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
Любопытно насчет
[[:digit:]]
, есть ли оболочка, которая не поддерживает [0-9]
?
- person Sundeep; 25.05.2021
Кроме того, вы можете упростить
[0-9]{3}([^0-9][^/]*)?$
до [0-9]{3}[^0-9/]*$
- person Sundeep; 25.05.2021
@Sundeep Нет,
[0-9]{3}[^0-9/]*$
не будет соответствовать 123-good-name01.txt
- person Wiktor Stribiżew; 25.05.2021
О, хорошее замечание... квантификатор притяжательности сделал бы это проще...
- person Sundeep; 25.05.2021
Еще раз хороший момент, я только что попробовал то, что, как я думал, сработает, но не сработало (хотя поиск помогает). Я думаю, что
[^0-9]
должно быть [^0-9/]
, иначе ./123/-good-name01.txt
будет соответствовать
- person Sundeep; 26.05.2021
Просто перефразируя предыдущий комментарий, который я удалил: я сомневаюсь, что здесь необходим притяжательный квантификатор. Вот хороший вариант использования притяжательного квантификатора.
- person Wiktor Stribiżew; 28.05.2021
[100-999]
равно[0-9]
, и ваше регулярное выражение требует, чтобы имя файла содержало только одну или несколько цифр. - person Wiktor Stribiżew   schedule 25.05.2021