Как исключить каталоги при перечислении файлов в текущем каталоге?
ls .
^ будет включать каталоги в списке.
Как исключить каталоги при перечислении файлов в текущем каталоге?
ls .
^ будет включать каталоги в списке.
Ответы:
Попробуй это:
find . -maxdepth 1 -not -type d
ls .
без каталогов - и вот оно.
-ls
или -exec ls -l {} \;
сделало бы это как ls -l
без каталогов.
Чтобы получить его в точности эквивалентно ls .
вам нужно не показывать скрытые каталоги.
find . -maxdepth 1 -not -type d -and -not -name '.*'
и это все еще оставляет вас с префиксом «./» к каждому имени файла. Это на самом деле не проблема, но я думаю, что это некрасиво. Я пошел с:
ls -p | grep -v '/$'
И это даст вам список, который выглядит так же, и вы также можете добавить дополнительные ls
аргументы. Добавьте, --color=always
и вы получите свои dircolors обратно, или -a
чтобы увидеть скрытые файлы.
Мне нравится ответ Александра, потому что он на самом деле зависит от характеристики файловой системы рассматриваемого файла, поэтому его никогда не одурачат. Мой ответ будет введен в заблуждение файлом, в котором последним символом его имени будет символ '/'. Но похоже, что это вызывает проблемы.
Хотя это старый пост, но я подумал, что это может помочь ..
$ 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, empty, ELF и так далее.
ls -t .|while read f;do [ -f "$f" ]&& echo $f;done
примерно в 3 раза быстрее в моих тестах
Я был в системе, где find
двоичный файл не поддерживал, -not
и я в конечном итоге использовал:
ls|while read f;do [ -f "$f" ]&& echo $f;done
Преимущества: не полагается ни на что, кроме как sh ls echo
совместимо с bash и dash.
Может быть изменено для соответствия другим вещам (например, каталогам) путем изменения. -f
Быстрее, чем некоторые ответы, и использует меньше оперативной памяти и ЦП.