Как исключить каталоги при перечислении файлов?

21

Как исключить каталоги при перечислении файлов в текущем каталоге?

ls .

^ будет включать каталоги в списке.

Стивен Уоткинс
источник

Ответы:

23

Попробуй это:

find . -maxdepth 1 -not -type d
Александр Гладыш
источник
3
будь проще: $ find. тип f
заклинило
9
Нет. (1) он будет рекурсивным, (2) он не будет перечислять символические ссылки. @ Стив попросил эквивалент ls .без каталогов - и вот оно.
Александр Гладыш
2
Добавление -lsили -exec ls -l {} \;сделало бы это как ls -lбез каталогов.
Ладададада
15

Чтобы получить его в точности эквивалентно ls .вам нужно не показывать скрытые каталоги.

find . -maxdepth 1 -not -type d -and -not -name '.*'

и это все еще оставляет вас с префиксом «./» к каждому имени файла. Это на самом деле не проблема, но я думаю, что это некрасиво. Я пошел с:

ls -p | grep -v '/$'

И это даст вам список, который выглядит так же, и вы также можете добавить дополнительные lsаргументы. Добавьте, --color=alwaysи вы получите свои dircolors обратно, или -aчтобы увидеть скрытые файлы.

Мне нравится ответ Александра, потому что он на самом деле зависит от характеристики файловой системы рассматриваемого файла, поэтому его никогда не одурачат. Мой ответ будет введен в заблуждение файлом, в котором последним символом его имени будет символ '/'. Но похоже, что это вызывает проблемы.

Шон О'Лири
источник
1
'-not' относится к GNU find, так как он не совместим с POSIX, лучше не учить этим параметрам, поскольку пользователь может иметь "плохие" привычки и чувствовать себя потерянным в других UNIX-
системах
2
@JiriXichtkniha, что POSIX альтернатива -не?
Лукас Галлиндо,
5

попробуй это:

$ найти. -тип f -maxdepth 1

или это:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

jamzed
источник
3

Хотя это старый пост, но я подумал, что это может помочь ..

$ ls -l | grep -v ^ d

В нем будут перечислены все файлы, включая символические ссылки, файлы символов и блоков.

sandeep.s85
источник
Этот ответ уже был предоставлен за год до того, как застрял (создавая визуальный шум).
Алекс Роше
2

Приведенные выше решения «найти» теряют некоторые возможности ls, например: выводить список только файлов, отсортированных по убыванию времени модификации.

Ответы "ls -p | grep" не относятся к другим элементам ls, таким как -R, если они желательны

Следующий ответ, хотя и более многословный, на мой взгляд, отражает истинное поведение ls и большую гибкость при выборе «только файлы»

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

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

Панчо
источник
0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

При этом вы все равно можете использовать любые другие варианты, которые lsобычно принимает. Или ... удалить -vв список только каталоги. Или ... замените каталог любым другим типом файлов, который fileпонимает и сообщает, например, ASCII, empty, ELF и так далее.

Каульбах
источник
Это не работает, если любое из имен файлов, которые будут перечислены, содержит пробелы.
Психонавт
ls -t .|while read f;do [ -f "$f" ]&& echo $f;doneпримерно в 3 раза быстрее в моих тестах
Алекс Роше
0

Я был в системе, где findдвоичный файл не поддерживал, -notи я в конечном итоге использовал:

ls|while read f;do [ -f "$f" ]&& echo $f;done

Преимущества: не полагается ни на что, кроме как sh ls echo
совместимо с bash и dash.
Может быть изменено для соответствия другим вещам (например, каталогам) путем изменения. -f
Быстрее, чем некоторые ответы, и использует меньше оперативной памяти и ЦП.

Алекс Рош
источник