Як я можу виключити каталоги при переліку файлів?


21

Як я можу виключити каталоги при переліку файлів у поточному каталозі?

ls .

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

Відповіді:


23

Спробуйте це:

find . -maxdepth 1 -not -type d

3
просто: $ find. -тип f
застряг

9
Ні. (1) це було б рекурсивно, (2) воно не перераховувало б посилання. @Steve попросив еквівалент ls .без каталогів - і ось він.
Олександр Гладиш

2
Додавання -lsабо -exec ls -l {} \;зробить це так, як ls -lбез каталогів.
Ladadadada

15

Щоб отримати його рівнозначно, ls .вам не потрібно показувати приховані бруди.

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

і це все ще залишає вас з "./" префіксом до кожного імені файлу. Це насправді не проблема, але я думаю, що це якось потворно. Я пішов:

ls -p | grep -v '/$'

І це дозволить отримати список, який виглядає так само, і ви можете також додати додаткові lsаргументи. Додайте а, --color=alwaysі ви отримаєте назад свої кольори або -aпобачите приховані файли.

Мені подобається відповідь Олександра, тому що він насправді залежить від файлової системи, характерної для відповідного файлу, тому його не обдурять ніколи. Мою відповідь буде обдурений файлом, який має "/" як останній символ у своєму імені. Але це здається, що це просить неприємностей.


1
"-not" пов'язаний з GNU, оскільки це не відповідає сумісності POSIX, краще не вчити цим параметрам, оскільки користувач може мати "погані" звички та почуватися втраченими в інших UNIXes :)
jirib

2
@JiriXichtkniha, що є POSIX альтернативою -но?
Лукас Галліндо


3

Хоча це старий пост, але я думав, що це може допомогти ..

$ ls -l | grep -v ^ d

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


Цю відповідь вже за рік до цього заклинили (заглушивши цей зоровий шум.)
Алекс Рош

2

Вищенаведені рішення "знайти" втрачають частину можливостей ls - наприклад: перераховують лише файли, відсортовані за зменшенням часу модифікації.

Відповіді "ls -p | grep" не елегантно стосуються інших елементів ls, таких як -R, якщо вони бажають

Наступний відповідь, в той час як більш багатослівним, на мій погляд , відображає справжню поведінку і максимальну гнучкість для «тільки файли» вибору

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, порожній, 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
: швидше, ніж деякі відповіді, і використовує менше оперативної пам'яті та процесора

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.