Как я могу перечислить все файлы одной папки, но не их папки или субфайлы. Другими словами: как я могу перечислить только файлы?
Как я могу перечислить все файлы одной папки, но не их папки или субфайлы. Другими словами: как я могу перечислить только файлы?
Ответы:
Использование find
:
find . -maxdepth 1 -type f
Использование этой -maxdepth 1
опции гарантирует, что вы будете просматривать только текущий каталог (или, если вы замените .
какой-либо путь, этот каталог). Если вам нужен полный рекурсивный список всех файлов в этом и подкаталогах, просто удалите эту опцию.
find
на mac нет ни -type
, ни -maxdepth
опций.
-type
и -maxdepth
не являются вариантами в обычном смысле слова; BSD find
(как используется в OS X) называет их первичными , и они должны идти после операнда (ов) имени файла ( .
в этом случае; обратите внимание, что, в отличие от Linux, версия BSD требует по крайней мере одного явного операнда имени файла); команда в этом ответе определенно работает на Mac.
find *.png -maxdepth 0 -type f
избегать ./
префикса в именах выходных файлов; также обратите внимание на -maxdepth
of 0
, а не 1
), пока все, что вам нужно, это имена файлов в алфавитном порядке . Если вы хотите, что в ls
противном случае может сделать для вас (другой формат вывода / порядок, встроенный контроль над включением скрытых элементов или нет), дополненный фильтрацией [multi-] типов, сценарий из моего ответа может помочь.
find * -maxdepth 0 -type f
(альтернатива, полученная из комментария @ AlexHall) с find . -maxdepth 1 -type f
ответом: find . ...
неизменно включает скрытые элементы, неизменно добавляет префиксы к именам выходных файлов с помощью ./
, а с GNU find
(Linux) обычно выводит несортированный список. find * ...
, из-за того, что оболочка позволяет оболочке выполнять подстановку вперед, по умолчанию исключает скрытые элементы (можно изменить с помощью shopt -s dotglob
), выводит простые имена файлов (без префикса), отсортированные по алфавиту. Ни один из подходов не включает символические ссылки на файлы; используйте опцию -L
для этого.
ls -p | grep -v /
ls -p позволяет вам отображать / после имени папки, которое действует как тег, который вы должны удалить.
ls
в дополнение к find
, поскольку последний возвращает относительные пути, а первый - только имена файлов. Используйте подходящий инструмент для работы.
Функция find
answer ( find . -maxdepth 1 -type f
) на основе carlpett работает в принципе, но не совсем то же самое, что и using ls
: вы получаете потенциально несортированный список имен файлов, все с префиксом./
, и вы теряете возможность применить ls
многие параметры ;
также find
всегда находит скрытые элементы , тогда как ls
поведение 'зависит от наличия или отсутствия опций -a
или -A
.
Улучшение , предложил Алекс Холл в комментариях по этому вопросу, чтобы объединить оболочки подстановки сfind
:
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
ls
многим другим параметрам сортировки / формата вывода.Ответ Ханса Роггемана ls
+grep
прагматичен, но не позволяет использовать -l
выходной формат long ( ) .
Для устранения этих недостатков я написал fls
( е 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)
Поддерживаемые платформы
Примечание. Даже если вы не используете 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).-1
(номер один); ls
фактически по умолчанию используется "голый" вывод, то есть только имена файлов, но при выводе на терминал используется макет на основе столбцов (несколько имен файлов в строке). Чтобы получить одно имя файла для каждой строки вывода (что и dir /b
имеет значение, если память обслуживает), используйте -1
параметр, который фактически неявно включен, когда stdout не подключен к терминалу, например, при отправке в канал или выходной файл.
Мне нравится использовать ls
опции, например:
-l
используйте длинный формат списка-t
сортировать по времени модификации, сначала самые новые-r
обратный порядок сортировки-F
,--classify
добавить индикатор (один из * / => @ |) к записям-h
,--human-readable
с -l и -s, размеры печати, такие как 1K 234M 2G и т. д.
Когда-то --color
и все остальные. (См. ls --help
)
Это покажет файлы, символические ссылки, устройства, каналы, сокеты и т. Д.
так
find /some/path -maxdepth 1 ! -type d
можно легко отсортировать по дате:
find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
или же
find /some/path -maxdepth 1 -type f
отсортировано по размеру:
find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Чтобы не отображать скрытые записи, где имя начинается с точки, вы можете добавить ! -name '.*'
:
find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
потом
Вы могли бы заменить /some/path
на .
в список для текущего каталога или ..
для родительского каталога .
Вы также можете использовать ls
с grep
или egrep
и поместить его в свой профиль в качестве псевдонима:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
найти файлы: ls -l / home | grep "^ -" | тр-с '' | вырезать -d '' -f 9
найти каталоги: ls -l / home | grep "^ d" | тр-с '' | вырезать -d '' -f 9
найти ссылки: ls -l / home | grep "^ l" | тр-с '' | вырезать -d '' -f 9
tr -s '' превращает вывод в файл с разделителями-пробелами, команда cut говорит, что разделитель является пробелом, и возвращает 9-е поле (всегда имя файла / имя каталога / имя ссылки).
Я постоянно этим пользуюсь!
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
добавлен, xargs
чтобы заставить его работать, и используется -1
вместо того, -l
чтобы показывать только имена файлов без дополнительной ls
информации
find -printf0 '...' | sort -z
Просто добавляю к ответу Карлпетта. Для более удобного просмотра файлов вы можете передать вывод в ls.
find . -maxdepth 1 -type f|ls -lt|less
Показывает последние измененные файлы в формате списка, что весьма полезно, если вы загрузили много файлов и хотите увидеть не загроможденную версию последних.
ls
не читает стандартный ввод, поэтому передавать что-либо по конвейеру бесполезно ls
. Вы пропустили xargs
?
find
команда в этом ответе полностью игнорируется ; общая команда является таким же , как ls -lt | less
, который не выполняет не фильтрации типа.
find
можно было find . -maxdepth 1 -type f -ls
. Она также , кажется, работает на Mac OS, хотя я считаю , -maxdepth
и -ls
не правильно портативные варианты.
"find '-maxdepth'" не работает с моей старой версией bash, поэтому я использую:
для f в $ (ls); делать, если [-f $ f]; затем echo $ f; fi; сделанный
for f in $(ls)
вдвойне неверно. Вы можете исправить это, for f in *
но тогда он сломается, потому что вы echo
неправильно цитируете аргумент .