Как я могу искать файл с фиксированной длиной имени с помощью ls?

Вероятно, сохранять ядро более простым. Я не думаю, что ядро когда-либо ищет Ваш путь для нахождения исполняемого файла. Это обрабатывается библиотекой C. #! обработка сделана в ядре, которое не использует стандартную библиотеку для C.

Кроме того, я не думаю, что ядро имеет понятие того, каков Ваш путь. $PATH переменная среды и только обрабатывает, имеют среду. Ядро не делает. Я предполагаю, что это могло получить доступ к среде процесса, который сделал должностное лицо, но я ничто в настоящее время не думаю в ядре никогда переменные среды доступов как этот.

5
08.01.2011, 20:35
4 ответа

Существует несколько методов:

ls только

ls lazer_??????

ls и egrep

ls | egrep '^lazer_.{6}$'

find

find . -regextype posix-egrep -regex '^./lazer_.{6}$'
7
27.01.2020, 20:33
  • 1
    Делает ls только распознайте * как подстановочный символ? –  Lazer 08.01.2011, 19:53
  • 2
    также принимает ? и [ ] –  wag 08.01.2011, 19:59
  • 3
    Это не ls кто разворачивает подстановочные знаки: это - оболочка, кто делает. –  alex 08.01.2011, 20:14
  • 4
    @Lazer, Что Вы испытываете, является различием между globbing и регулярными выражениями. К сожалению, эти две грамматики совместно используют некоторые из тех же символов, но у них есть совсем другие значения. В regex, . средства любой отдельный символ, но с шариками, это указано ?. Оболочки понимают globbing, не regex. –  SiegeX 08.01.2011, 23:45
  • 5
    В Bash, простой способ ввести ??????: <Esc> 6? или Alt-6? –  ephemient 09.01.2011, 00:43

Как указано SiegeX, один только Shell не понимает регулярных выражений. Если Вы хотите точный фильтр своих файлов, необходимо использовать регулярные выражения и следовательно использовать команду как egrep.

Здесь, файлы, которые Вы хотите перечислить, начинаются lazer_ и сопровождаются только некоторыми цифрами (возможно более или менее это 6). Я сделал бы это этот путь:

ls | egrep '^lazer_[[:digit:]]*$'

Этот regex работает то же как '^lazer_[0-9]*$'.

Регулярные выражения с egrep также повторение дескрипторов точно так же, как в ответе взмаха, если Вы хотите ограничить свой список файлами, заканчивающимися точно 6 цифрами:

ls | egrep '^lazer_[[:digit:]]{6}$'
2
27.01.2020, 20:33

С zsh вы можете использовать глобус вроде ? (# CN) (здесь для флага c требуется предыдущий ? , чтобы точно соответствует N раз):

setopt extendedglob
print -rl -- ?(#c12)

если вы предпочитаете ls :

ls -d -- ?(#c12)

Вы также можете добавить квалификаторы, например рекурсивный поиск обычных файлов с фиксированной длиной имени:

print -rl -- **/?(#c12)(.)
2
27.01.2020, 20:33

С ksh93 :

printf '%s\n' {12}(?)

для (не скрытых) файлов, имена которых состоят из 12 символов.

Или, если вы предпочитаете регулярные выражения:

printf '%s\n' ~(E)^.{12}$
2
27.01.2020, 20:33

Теги

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