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

Я думаю, что следующее является решением моей проблемы. После выполнения

sudo apt-get update
sudo apt-get upgrade

Я также должен работать

sudo apt-get dist-upgrade

и затем перезагрузите сервер. Это, казалось, работало на меня, но если у кого-либо есть больше опыта, не стесняйтесь редактировать этот ответ, комментировать его или предоставлять лучший ответ.

21
задан 10 March 2012 в 20:37
7 ответов

Попробуйте следующее:

find . -maxdepth 1 -not -type d
23
ответ дан 2 December 2019 в 20:03

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

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

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

ls -p | grep -v '/ $'

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

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

15
ответ дан 2 December 2019 в 20:03

попробуйте следующее:

$ find. -тип f -maxdepth 1

или это:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d

5
ответ дан 2 December 2019 в 20:03

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

$ ls -l | grep -v ^ d

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

3
ответ дан 2 December 2019 в 20:03
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

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

0
ответ дан 2 December 2019 в 20:03

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

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

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

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

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

2
ответ дан 2 December 2019 в 20:03

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

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

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

.
0
ответ дан 2 December 2019 в 20:03

Теги

Похожие вопросы