Список каталогов, которые содержат две последовательные гласные в названии.Команда терминала Linux - PullRequest
1 голос
/ 26 мая 2011

Вопрос в следующем: Напишите команду для печати количества каталогов в / home, которые содержат две последовательные гласные (строчные буквы).

Я пытался:

ls /home/*[aeiou][aeiou]*

однако очевидно, почему это не работает.

Я пытался:

ls /home | grep *[aeiou][aeiou]*

и я ничего не получаю. Я знаю, как только я выясняю, как изолировать каталоги двумя последовательными гласными, которые мне нужны, чтобы передать это в команду wc. Или, если я использую grep, я могу просто использовать -c. Я также пытался найти, но это было бесполезно.

Ответы [ 5 ]

4 голосов
/ 26 мая 2011

Все, что вам нужно, это:

 ls -d *[aeiou][aeiou]*/

Поскольку конечный слеш ограничит глобус каталогами.

Становится более разумным, если вы хотите, чтобы он был без учета регистра, или был рекурсивным, или включал каталоги, имена которых начинаются с точки, или если вы хотите включить y, когда это гласный, но не согласный,или вам нужно учесть возможные диакритические знаки в ваших гласных, & c & c & c.

4 голосов
/ 26 мая 2011

уточнение ответа Сверре,

ls -d */ | grep '[aeiou]\{2,2\}'

вам не нужно .* до и после - он найдет совпадения по умолчанию.

Опция -d с */ будет печатать только имена каталогов.

3 голосов
/ 26 мая 2011

grep соответствует регулярному выражению, а не глобальному.

ls -d */ | grep '[aeiou]\{2\}'

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

Спасибо @harpo за то, как отфильтровать каталоги.

2 голосов
/ 26 мая 2011

ls /home/*[aeiou][aeiou]* найдет нужные вам каталоги, но затем перечислит комментарии.

ls -d /home/*[aeiou][aeiou]* перечислит имена каталогов, а не их содержимое.

ls -d /home/*[aeiou][aeiou]* | wc -l будет подсчитывать количество подходящих записей.

Как уже отмечали другие, добавление / в конец гарантирует, что вы видите только каталоги, а не обычные файлы с двумя гласными.

2 голосов
/ 26 мая 2011

Вы используете find, чтобы ограничить поиск по каталогам. Поскольку find является рекурсивным, вы должны установить нижнюю и верхнюю границы пройденных объектов файловой системы. Затем вы печатаете символ для каждой записи и подсчитываете его.

find /home -mindepth 1 -maxdepth 1 -type d -name '*[aeiou][aeiou]*' -printf '*' | wc -c
...