Каталоги являются одним из многих типов файлов . Какие типы файлов вас интересуют (обычный, символическая ссылка, устройство, канал, сокет ...)?
Стефан Шазелас
Неясно, говорите ли вы под «каталогом» о содержимом каталогов или о самих именах каталогов. Команда, которую вы показываете, будет перечислять содержимое каталогов, соответствующих шаблону, при этом ls -d /etc/[ac]*вы не будете получать содержимое соответствующих каталогов, но все равно будете видеть имена каталогов. Неясно, хотите ли вы этого или не хотите даже перечислять имена каталогов.
Кусалананда
Ответы:
23
Чтобы избежать перечисления содержимого каталогов, вы можете:
ls -d /etc/[ac]*
Это перечислит имена каталогов вместе с обычными именами файлов, начинающимися с aили c.
Мое первоначальное прочтение вопроса также ls -dпоказалось мне подходящим, но кажется, что в первоначальном вопросе указано, что каталоги не должны быть перечислены, независимо от расширения или отсутствия расширения.
@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.
Обратите внимание, что -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'
Как это позволит избежать каталогов, как указано в вопросе?
Крис Даун
О, мое неверное прочтение. Я думаю, что OP хочет каталог, но не его содержимое.
cuonglm
Извините за это редактирование, полностью неправильно прочитано.
Тердон
1
Не рекурсивный без find:
ls -pd /etc/[ac]* | grep -v '/$'
-pдобавляет /в конце для каталогов, которую grepотфильтровывает. Конечно, не работает для имен файлов, которые содержат специальные символы, такие как переводы строк.
Будет ли список обычных файлов (как в -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]*(-^/)
выдаст список файлов, которые не относятся к каталогу типов после разрешения символических ссылок.
ls -d /etc/[ac]*
вы не будете получать содержимое соответствующих каталогов, но все равно будете видеть имена каталогов. Неясно, хотите ли вы этого или не хотите даже перечислять имена каталогов.Ответы:
Чтобы избежать перечисления содержимого каталогов, вы можете:
Это перечислит имена каталогов вместе с обычными именами файлов, начинающимися с
a
илиc
.Для полноты, решение без участия
find
может быть:источник
ls -d
показалось мне подходящим, но кажется, что в первоначальном вопросе указано, что каталоги не должны быть перечислены, независимо от расширения или отсутствия расширения.ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9
не разобратьls
.ls
на мой взгляд , разбор является честной игрой./etc
очень вероятно, будут нормальными, простое пространство нарушитls
подход, так как номера полей изменятся. +1ls -ld
хотя.LC_ALL=C
), дата не обязательно должна иметь 3 поля в других локалях.Рекурсивный:
Если вам требуется отсутствие рекурсии, вы можете сделать это переносимо:
Или это не переносимо (GNU или недавняя находка BSD):
Если вы хотите сделать это без учета регистра, используйте
-iname
вместо-name
.источник
-type f
для обычных файлов . Если вместо этого вам нужны файлы не из каталогов, замените их! -type d
(или! -xtype d
GNU,find
если вы также хотите исключить символические ссылки на каталоги).Вы можете попробовать эту команду также,
источник
Если вам нужны как каталоги (не содержимое каталога), так и файлы, вы можете использовать
printf
bultin:Пример:
источник
Не рекурсивный без
find
:-p
добавляет/
в конце для каталогов, которуюgrep
отфильтровывает. Конечно, не работает для имен файлов, которые содержат специальные символы, такие как переводы строк.источник
С
zsh
:Будет ли список обычных файлов (как в
-type f
вfind
),/etc
чье имя начинается сa
илиc
.(xxx)
Часть в конце Глоб является ЗШ-специфическая особенность называется подстановкой классификатора..
под классификатором globbing подразумевается обычный файл .Если шарик не совпадает,
zsh
будет отменена команда. Обратите внимание, что в других оболочках, похожих на Bourne, если глобус не совпадает, шаблон расширяется до самого себя, поэтомуls -d /etc/[ac]*
может некорректно отображать файл с именем,/etc/[ac]*
если нет файла, начинающегося сa
илиc
внутри/etc
.будет список файлов, которые не имеют типа каталога и
выдаст список файлов, которые не относятся к каталогу типов после разрешения символических ссылок.
источник
Для отображения файлов, начинающихся с:
Для отображения файлов, начинающихся с c:
источник