Я могу использовать, ls -ld */
чтобы перечислить все записи каталога в текущем каталоге. Есть ли такой же простой способ просто перечислить все обычные файлы в текущем каталоге? Я знаю, я могу использовать найти
find . -maxdepth 1 -type f
или стат
stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
но они не кажутся мне слишком элегантными. Есть ли хороший короткий способ перечислить только обычные файлы (меня не волнуют устройства, каналы и т. Д.), Но не подкаталоги текущего каталога? Перечисление символических ссылок также будет плюсом, но не является необходимостью.
find
команда - лучший способ сделать то, что вы хотите. Для некоторых других надежных опций вы должны изучить команды, специфичные для оболочки (и это не портативные программы)!ls -d */
, короткое, легко набираемое и понятное. Так что я очень доволен ответом Ульриха Дангела, хотя я не использую zsh.Ответы:
С помощью
zsh
и Glob Qualifiers вы можете легко выразить это напрямую, например:будет либо только возвращать список обычных файлов, либо ошибку в зависимости от вашей конфигурации.
Для не-каталогов:
(будет включать символические ссылки (в том числе на каталоги), именованные каналы, устройства, сокеты, двери ...)
для обычных файлов и символических ссылок на обычные файлы.
для не-каталогов и никаких символических ссылок на каталоги.
Кроме того , см
D
глобирования спецификатора , если вы хотите включить D от простых файлов (скрытые файлы), как*(D-.)
.источник
Эта команда выводит список всех не скрытых файлов, которые не являются каталогами (обычные файлы, ссылки, файлы устройств и т. Д.). Чтобы также включить скрытые файлы, добавьте
-A
параметр вls
Предполагается, что ни один из файлов не имеет символов новой строки в своем имени. Добавление
-q
опции дляls
преобразования всех непечатаемых символов, включая символ новой строки?
, гарантирует, что они находятся в одной строке, и, таким образом, подходит для подачи в утилиту на основе строки, например,grep
и для печати на терминале.источник
--color=always
кls
, для OSX-G
.sudo chmod 777
конце, и мне дали ошибки ... Любая помощь очень ценитсяls -pL | grep -v /
. Добавлены-L
разыменования символических ссылок.ls -pdL something* | grep -v /
. В добавленной-d
опции перечислены сами каталоги, а не их содержимое, поэтому они будут исключены правильно.Для просмотра только обычных файлов:
С символическими ссылками (на любой тип файла) включены:
Где первый символ списка описывает тип файла, это
-
означает, что это обычный файл, для символической ссылки естьl
.Debian / Ubuntu
Напечатайте имена всех подходящих файлов (включая ссылки):
С абсолютными путями:
Напечатайте имена всех файлов,
/etc
которые начинаются сp
и заканчиваются наd
:источник
ls
у него нет возможности сделать это, но одна из приятных особенностей unix & linux заключается в том, что длинные и неэлегичные конвейеры можно легко превратить в сценарий оболочки, функцию или псевдоним. и они, в свою очередь, могут использоваться в конвейерах, как и любая другая программа.(ПРИМЕЧАНИЕ. Существуют некоторые проблемы с областями действия для функций и псевдонимов. Сценарии доступны любому исполняемому файлу, который может их читать и выполнять. Псевдонимы и функции доступны только в текущей оболочке, хотя .profile / .bashrc и т. Д. Вложенной оболочки могут переопределять и, таким образом, сделать их доступными. Кроме того, сценарий может быть написан на любом языке - включая bash / sh, awk, perl, python и другие - в зависимости от того, какой из них лучше подходит для работы или с которым вы наиболее знакомы)
например
alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'
Я добавил xargs, чтобы вы могли использовать все обычные
ls
опции, напримерlsf -lrS
Поскольку он использует
find
, все обычно скрытые точечные файлы будут отображаться, и все имена файлов будут иметь префикс ./ - это единственное отличие, которое вы заметите.Вы можете исключить точечные файлы с помощью,
! -iname '.*'
но тогда вам понадобится две версии псевдонима: одна отображает точечные файлы, а другая - нет.alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'
В качестве альтернативы, если это
lsf
был сценарий, а не псевдоним, вы можете проанализировать параметры (возможно, с помощью getopts или / usr / bin / getopt или аналогичных) и исключить точечные файлы, если они-a
отсутствуют.источник
-name
достаточно, вам не нужно-iname
.Опция -F для ls добавляет * к исполняемым файлам, / к каталогам, @ к символическим ссылкам, = к сокетам и | в ФИФО. Затем вы можете использовать grep для исключения нестандартных файловых символов из вывода, и у вас есть файлы. Это будет работать в любой оболочке, а не только в Zsh.
Слабые стороны:
@
,=
или|
будет исключен (но вы не должны действительно есть файлы с этими символами в названии так или иначе)источник
=
,@
или|
символы.=
обычно встречается в maildir или именах файлов, которые имеют закодированную часть в формате base64 или в кавычках.@
в определениях локалей, для адресов электронной почты и многого другого. Однако они редко появляются в конце имени файла. (например, только 31 из 2,2 миллионов в этой системе)В руководстве указано, что опция «f» предназначена только для «обычного файла», а не для каналов, сокетов или блочных / символьных устройств, что означает, что вы уже делаете правильные вещи.
источник
Это не особенно коротко, но вы можете превратить его в скрипт или псевдоним, если вам нужно быстро его вызвать. Используя команду ls в качестве входного массива, вызовите ls -ld для каждой записи, переданной в grep, чтобы исключить каталоги с выводом, отправленным в null, и в случае успеха повторить исходный ввод:
Вы можете инвертировать grep и условный вывод, те же результаты:
источник
\dev\null
?!?!Это немного старая тема, но самый чистый способ перечислять только файлы.
источник
touch "some file name"
чтобы увидеть быстрый контрпримерls -al | grep '^-' | awk '{ for(i=9; i<=NF; ++i) printf $i""FS; print "" }'
, должен обрабатывать файлы с пробелами в них.