Как мне исключить каталоги при перечислении файлов в текущем каталоге?
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
Самый быстрый, чем некоторые ответы, и требует меньше ОЗУ и ЦП