Как я могу перечислить все файлы одной папки, но не их папки или подфайлы. Другими словами: Как я могу перечислить только файлы?
Как перечислить только файлы, а не каталоги директории Bash?
Ответ 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; сделано