Назад | Перейти на главную страницу

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

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

ls .

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

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

find . -maxdepth 1 -not -type d

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

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

и это по-прежнему оставляет вас с префиксом './' перед каждым именем файла. На самом деле это не проблема, но я думаю, что это некрасиво. Я пошел с:

ls -p | grep -v '/$'

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

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

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

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

или это:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

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

$ ls -l | grep -v ^ d

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

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

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

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

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

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

ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

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

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

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

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