Подтвердить что ты не робот

Как перечислить только файлы, а не каталоги директории Bash?

Как я могу перечислить все файлы одной папки, но не их папки или подфайлы. Другими словами: Как я могу перечислить только файлы?

4b9b3361

Ответ 1

Использование find:

find . -maxdepth 1 -type f

Использование опции -maxdepth 1 гарантирует, что вы будете смотреть только в текущем каталоге (или, если вы замените . на некоторый путь, этот каталог). Если вам нужен полный рекурсивный список всех файлов в этом и подкаталогах, просто удалите эту опцию.

Ответ 2

  • carlpett find -based ответ (find. -maxdepth 1 -type f) в принципе работает, но не совсем то же самое, что и использование ls: вы получаете потенциально несортированный список имен файлов с префиксом ./ и теряете способность применять ls много вариантов;
    Кроме того, find всегда находит скрытые элементы, а поведение ls зависит от наличия или отсутствия -a или -a.

    • Улучшение, предложенное Алексом Холлом в комментарии к вопросу, состоит в том, чтобы объединить глобализацию оболочки с find:

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • Однако, в то время как это решает проблему префикса и дает в алфавитном порядке отсортирован, вы по- прежнему не имеют ни (встроенный) контроль над включением скрытых элементов, ни доступа к ls много других вариантов сортировки/вывода формата.
  • Hans Roggeman ls + grep ответ прагматичен, но он блокирует использование длинного (-l) формата вывода.


Чтобы устранить эти ограничения, я написал fls (f iltering ls),

  • утилита, которая обеспечивает гибкость вывода ls а также возможность фильтрации типов,
  • просто поместив символы фильтрации типов, такие как f для файлов, d для каталогов и l для символических ссылок перед списком аргументов ls (для получения дополнительной информации запустите fls --help или fls --man).

Примеры:

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

Монтаж

Поддерживаемые платформы

  • При установке из реестра npm: Linux и macOS
  • При установке вручную: любая платформа Unix -l ike с Bash

Из реестра npm

Примечание: даже если вы не используете Node.js, его менеджер пакетов, npm, работает на разных платформах и прост в установке;пытаться
curl -l https://git.io/n-install | bash

С установленным Node.js установите следующим образом:

[sudo] npm install fls -g

Примечание:

  • Требуется ли вам sudo зависит от того, как вы установили Node.js/io.js и изменили ли вы разрешения позже; если вы получили ошибку EACCES, попробуйте еще раз с sudo.

  • -g обеспечивает глобальную установку и необходим для установки fls в вашей системе $PATH.

Ручная установка

  • Загрузите этот bash скрипт как fls.
  • Сделайте его исполняемым с помощью chmod +x fls.
  • Переместите его или создайте символическую ссылку на папку в вашем $PATH, например, /usr/local/bin (macOS) или /usr/bin (Linux).

Ответ 3

ls -p | grep -v /

ls -p позволяет вам показывать/после имени папки, которая действует как тег для удаления.

Ответ 4

Вы также можете использовать ls с grep или egrep и поместить его в свой профиль как псевдоним:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

Ответ 5

Я использую этот синтаксис:

find -maxdepth 1 -type f | ls

поэтому я могу перечислить только файлы в текущем каталоге и дать этому ls хороший дисплей.

Ответ 6

{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

добавлен xargs, чтобы он работал, и использовал -1 вместо -l, чтобы показывать только имена файлов без дополнительной ls info

Ответ 7

С regex:

ls -al | egrep -v "^ d. *"

Ответ 8

Просто добавив к carlpett ответ. Для много полезного представления файлов вы можете передать вывод в ls.

find . -maxdepth 1 -type f|ls -lt|less

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

Ответ 9

"find '-maxdepth" не работает с моей старой версией bash, поэтому я использую:

для f в $(ls); do, если [-f $f]; затем echo $f; fi; сделано