Список только обычных файлов (но не каталогов) в текущем каталоге

Я могу использовать ls -ld */ для перечисления всех записей в каталоге в текущем каталоге. Есть ли простой способ просто перечислить все обычные файлы в текущем каталоге? Я знаю, что могу использовать find

 find . -maxdepth 1 -type f 

или стат

 stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3- 

но они не кажутся мне слишком элегантными. Есть ли хороший короткий способ для перечисления только обычных файлов (я не забочусь о устройствах, трубах и т. Д.), Но не о подкаталогах текущего каталога? Листинг символических ссылок также будет плюсом, но не является необходимостью.

  • Могу ли я использовать .bashrc, чтобы ls отображал цвета как на OS / X, так и на Linux?
  • Определение количества файлов и подкаталогов в Linux
  • EXT3: Если размер блока равен 4K, почему ls -l показывает размеры файлов ниже этого?
  • Человеко-читаемый вывод ls в AIX?
  • Как я могу перечислить все файлы и символические ссылки в компактном представлении?
  • передача переменной ls в grep при выполнении поиска файла работает только внутри каталога
  • Понимание команды «grep» показывает разные результаты, чем ожидалось
  • Как Linux вычисляет общее количество блоков при запуске / bin / ls -l?
  • 7 Solutions collect form web for “Список только обычных файлов (но не каталогов) в текущем каталоге”

    С квалификаторами zsh и Glob вы можете легко выразить это напрямую, например:

     echo *(.) 

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

    Для не-каталогов:

     echo *(^/) 

    (будет включать символические ссылки (в том числе в каталоги), именованные каналы, устройства, розетки, двери …)

     echo *(-.) 

    для обычных файлов и символических ссылок на обычные файлы.

     echo *(-^/) 

    для не-каталогов и без символических ссылок на каталоги.

    Кроме того, см. Квалификатор D globbing, если вы хотите включить D ot файлы (скрытые файлы), например *(D-.) .

     ls -p | grep -v / 

    Эта команда перечисляет все, что не является каталогом (файлы, ссылки, файлы устройств и т. Д.).

    Чтобы перечислить только обычные файлы:

     ls -al | grep '^-' 

    С символическими ссылками (к любому типу файла):

     ls -al | grep '^[-l]' 

    Если первый символ списка описывает тип файла, значит, это означает, что он является обычным файлом, для символической ссылки – l .

    Debian / Ubuntu

    Распечатайте имена всех совпадающих файлов (включая ссылки):

     run-parts --list --regex . . 

    С абсолютными путями:

     run-parts --list --regex . "$PWD" 

    Распечатайте имена всех файлов в /etc которые начинаются с p и заканчиваются на d :

     run-parts --list --regex '^p.*d$' /etc 

    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 , будут отображаться все нормально скрытые dotfiles, и все имена файлов будут префиксны ./ – это единственное различие, которое вы заметите.

    Вы можете исключить файлы точек ! -iname '.*' ! -iname '.*' но тогда вам придется иметь две версии псевдонима: одну, которая отображает файлы точек, а другая – нет.

    alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

    В качестве альтернативы, если lsf был сценарием, а не псевдонимом, вы могли бы проанализировать параметры (возможно, с помощью getopts или / usr / bin / getopt или аналогичные) и исключить dotfiles, если не было.

     bash-4.2$ ls -F | grep -v '[/@=|]$' | more 

    Опция -F для ls добавляет * к исполняемым файлам, / в каталоги, @ к символическим ссылкам, = к сокетам и | для FIFO. Затем вы можете использовать grep для исключения нерегулярных символов файла с вывода, и у вас есть файлы. Это будет работать в любой оболочке, а не только zsh.

    Слабые стороны:

    1. Любой файл, имя которого заканчивается на @ , = или | будут исключены (но в любом случае у вас не должно быть файлов с этими символами в имени)
    2. Это не исключает файлы устройств или некоторые экзотические типы файлов на некоторых системах, таких как двери.
    3. У вас будет звездочка, добавленная в любой исполняемый файл. Это может быть обработано путем соединения через sed для удаления любых символов «*» из вывода.
    4. Это не работает должным образом, если есть имена файлов, содержащие символы новой строки.

    В руководстве указано, что опция «f» используется только для «обычного файла», а не для труб, сокетов или блоков / символов, что означает, что вы уже делаете нужные вещи.

      -type c File is of type c: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular file l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype. s socket D door (Solaris) 

    Это не особенно коротко, но вы можете превратить его в скрипт или псевдоним, если вам нужно быстро его называть. Используя команду ls в качестве входного массива, вызовите ls -ld для каждой записи, подключенной к grep, чтобы исключить каталоги с выходом, отправленным на нуль, и, если удастся выполнить эхо исходный ввод:

     for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ; 

    Вы можете инвертировать grep и условный вывод, такие же результаты:

     for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ; 
    Interesting Posts

    Поддерживает ли какая-либо ОС ZFS на MIPS?

    Символы на / dev / ttyUSB * через udev

    Внешний экран, сотрясающий Fedora

    Как получить список приложений, связанных с файлом, используя командную строку

    Отменить все переменные ENV, соответствующие _PROXY

    Не знаю, как устранить проблему с электронной почтой Bugzilla

    Как записать mp3-файлы на аудиодиск в Scientific-Linux 6.1?

    Измененная материнская плата, процессор и оперативная память – теперь я получаю цикл перезагрузки после выбора Debian из GRUB

    Перенос настроек XFCE из одной системы в другую?

    Настройка глобальных разрешений для просмотра для подкаталогов (rx), но делает файлы недоступными для всех, кроме владельцев и членов группы

    Как я могу исправить адрес при пересылке с помощью почты / exim?

    Что такое сообщение об ошибке tar «Не удается открыть: неверный аргумент»

    Отказ от доступа к MySQL (CentOS)

    Как остановить бесконечную функцию цикла, вызванную с помощью myFunc &

    Ubuntu 14.04 войти на рабочий стол в режиме одного пользователя

    Linux и Unix - лучшая ОС в мире.