Как вывести список файлов, начинающихся с «a» или «c» из / etc. [закрыто]


10

Я пытался, ls /etc/[ac]*но он показывает каталоги, начинающиеся с a или c , и все их содержимое, а не файлы, начинающиеся с " a " или " c ".


Каталоги являются одним из многих типов файлов . Какие типы файлов вас интересуют (обычный, символическая ссылка, устройство, канал, сокет ...)?
Стефан Шазелас

Неясно, говорите ли вы под «каталогом» о содержимом каталогов или о самих именах каталогов. Команда, которую вы показываете, будет перечислять содержимое каталогов, соответствующих шаблону, при этом ls -d /etc/[ac]*вы не будете получать содержимое соответствующих каталогов, но все равно будете видеть имена каталогов. Неясно, хотите ли вы этого или не хотите даже перечислять имена каталогов.
Кусалананда

Ответы:


23

Чтобы избежать перечисления содержимого каталогов, вы можете:

ls -d /etc/[ac]*

Это перечислит имена каталогов вместе с обычными именами файлов, начинающимися с aили c.

Для полноты, решение без участия findможет быть:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

Мое первоначальное прочтение вопроса также ls -dпоказалось мне подходящим, но кажется, что в первоначальном вопросе указано, что каталоги не должны быть перечислены, независимо от расширения или отсутствия расширения.
Крис Даун

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9не разобрать ls.
Авинаш Радж

1
@AvinashRaj: Ну, актуальность этого совета зависит от того, нужно ли это решение, чтобы работать один раз или навсегда. Если только один раз, то, lsна мой взгляд , разбор является честной игрой.
Грег Хьюгилл

3
У него есть точка зрения. В то время как имена в /etcочень вероятно, будут нормальными, простое пространство нарушит lsподход, так как номера полей изменятся. +1 ls -ldхотя.
Тердон

1
Вам также нужно исправить локаль ( LC_ALL=C), дата не обязательно должна иметь 3 поля в других локалях.
Стефан Шазелас

7

Рекурсивный:

find /etc -type f -name '[ac]*'

Если вам требуется отсутствие рекурсии, вы можете сделать это переносимо:

find /etc/. ! -name . -prune -type f -name '[ac]*'

Или это не переносимо (GNU или недавняя находка BSD):

find /etc -type f -maxdepth 1 -name '[ac]*'

Если вы хотите сделать это без учета регистра, используйте -inameвместо -name.


1
Обратите внимание, что -type fдля обычных файлов . Если вместо этого вам нужны файлы не из каталогов, замените их ! -type d(или ! -xtype dGNU, findесли вы также хотите исключить символические ссылки на каталоги).
Стефан Шазелас

1

Вы можете попробовать эту команду также,

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

Если вам нужны как каталоги (не содержимое каталога), так и файлы, вы можете использовать printfbultin:

printf "%s\n" [ac]*

Пример:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

Как это позволит избежать каталогов, как указано в вопросе?
Крис Даун

О, мое неверное прочтение. Я думаю, что OP хочет каталог, но не его содержимое.
cuonglm

Извините за это редактирование, полностью неправильно прочитано.
Тердон

1

Не рекурсивный без find:

ls -pd /etc/[ac]* | grep -v '/$'

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


1

С zsh:

print -rl /etc/[ac]*(.)

Будет ли список обычных файлов (как в -type fв find), /etcчье имя начинается с aили c. (xxx)Часть в конце Глоб является ЗШ-специфическая особенность называется подстановкой классификатора. .под классификатором globbing подразумевается обычный файл .

Если шарик не совпадает, zshбудет отменена команда. Обратите внимание, что в других оболочках, похожих на Bourne, если глобус не совпадает, шаблон расширяется до самого себя, поэтому ls -d /etc/[ac]*может некорректно отображать файл с именем, /etc/[ac]*если нет файла, начинающегося с aили cвнутри /etc.

print -rl /etc/[ac]*(^/)

будет список файлов, которые не имеют типа каталога и

print -rl /etc/[ac]*(-^/)

выдаст список файлов, которые не относятся к каталогу типов после разрешения символических ссылок.


-3

Для отображения файлов, начинающихся с:

ls etc |  grep ^a

Для отображения файлов, начинающихся с c:

ls etc |  grep ^c
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.