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

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

 find . -maxdepth 1 -type f 

или стат

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

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

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 ; 
  • Каково определение префикса, номера версии и суффикса в имени файла для сортировки версий?
  • Алфавитные имена в псевдонимах `ls` с .files не перепутаны
  • Поиск файлов с использованием ls и подстановочных знаков
  • Как определить количество подкаталогов и файлов из команды ls -ld?
  • Как понять контекст безопасности в «ls -Z»?
  • Исключая конкретный каталог, используя рекурсивный 'ls'
  • Команда ls: что означает первая строка?
  • Вместо использования ls, как он работает с `find`?
  • Показывать заголовки столбцов командой «ls»
  • dircolor ошибки, вызванные разрешением ntfs-3g
  • Странное форматирование даты в сценарии bash
  • EXT3: Если размер блока равен 4K, почему ls -l показывает размеры файлов ниже этого?
  • Linux и Unix - лучшая ОС в мире.