Як перерахувати лише файли, а не каталоги каталогу Bash?


84

Відповіді:


113

Використання find:

find . -maxdepth 1 -type f

Використання -maxdepth 1опції гарантує, що ви шукаєте лише поточний каталог (або, якщо ви заміните .якийсь шлях, цей каталог). Якщо ви хочете отримати повний рекурсивний список усіх файлів у цьому та підкаталогах, просто видаліть цю опцію.


Після мого коментаря до відповіді mklement0 я зрозумів, що "find ./*.png -maxdepth 1-type f> pngs.txt", мабуть, зробить те саме. Це робить. Без встановлення сценарію.
Алекс Холл

2
findна mac, не має ні -type, ні -maxdepthопцій.
Тимофій

1
@Tim: -typeі -maxdepthне є опціями в звичайному розумінні; BSD find(як використовується в OS X) називає їх первинними елементами , і вони повинні йти після операнда (ів) файлу ( .у цьому випадку; зауважте, що, на відміну від Linux, версія BSD потребує принаймні одного явного операнда імені файлу); команда у цій відповіді однозначно працює на Mac.
mklement0 07

1
@AlexHall: Це розумне рішення (хоча я пропоную , find *.png -maxdepth 0 -type fщоб уникнути ./префікса в вихідних файлах, також зверніть увагу -maxdepthна 0, що не 1), до тих пір , як все , що вам потрібно , це файл імена в алфавітному порядку . Якщо ви хочете, що lsможна зробити для вас інакше (інший формат виводу / впорядкування, вбудований контроль над тим, чи включені приховані елементи чи ні), доповнений фільтруванням типу [multi-], сценарій з моєї відповіді може допомогти.
mklement0 07

1
Для протиставлення find * -maxdepth 0 -type f(альтернатива, отримана з коментаря @ AlexHall) з find . -maxdepth 1 -type fвідповіді: find . ...незмінно включає приховані елементи, незмінно префіксує імена вихідних файлів з ./, і, в GNU find(Linux), як правило, видає невідсортований список. find * ..., завдяки дозволяючи оболонці виконувати глобалізацію вперед, за замовчуванням виключає приховані елементи (їх можна змінити за допомогою shopt -s dotglob), виводить лише імена файлів (без префіксу), відсортовані за алфавітом. Жоден з підходів не включає символічні посилання на файли; використовувати опцію -Lдля цього.
mklement0 07

14
ls -p | grep -v /

ls -p дозволяє показувати / після назви папки, яка діє як тег для видалення.


Приємно бачити приклад, який використовується lsна додаток до find, оскільки останній повертає відносні шляхи та перші лише імена файлів. Використовуйте відповідний інструмент для роботи.
Бен Амос,

5
  • Відповідь на findоснові carlpett ( find . -maxdepth 1 -type f) працює в принципі, але не зовсім збігається з використанням ls: ви отримуєте потенційно несортований список імен файлів, усі з префіксом./ , і ви втрачаєте можливість застосовувати lsбагато опцій ;
    також find незмінно знаходить також приховані предмети , тоді як ls'поведінка залежить від наявності або відсутності параметрів -aабо -A.

    • Поліпшення , запропонував Алекс Холл в коментарях з цього питання, щоб об'єднати оболонки підстановки зfind :

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • Однак, хоча це вирішує проблему префікса і надає вам алфавітно відсортований вивід , ви все ще не маєте ні (вбудованого) контролю над включенням прихованих елементів, ні доступу до lsбагатьох інших варіантів форматування сортування / виводу.
  • Відповідь ls+grep Ганса Роггемана прагматична, але блокує вас у використанні -lформату виводу long ( ) .


Для вирішення цих обмежень я написав утиліту fls( f iltering ls ) ,

  • утиліта, яка забезпечує вихідну гнучкість,ls одночасно забезпечуючи можливість фільтрації типів ,
  • просто розмістивши символи фільтрування типів, такі як fфайли, dкаталоги та lсимвольні посилання перед списком lsаргументів (запустіть fls --helpабо fls --manдізнайтеся більше).

Приклади:

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

Встановлення

Підтримувані платформи

  • При встановленні з реєстру npm : Linux та macOS
  • При встановленні вручну : будь - яка Unix-подібна платформа з Bash

З реєстру npm

Примітка: Навіть якщо ви не використовуєте Node.js, його менеджер пакетів npm, працює на різних платформах і його легко встановити; спробуй
curl -L https://git.io/n-install | bash

Після встановлення Node.js встановлюйте наступним чином:

[sudo] npm install fls -g

Примітка :

  • Чи вам це потрібно, sudoзалежить від того, як ви встановили Node.js / io.js і чи змінили ви дозволи пізніше ; якщо з'являється EACCESпомилка, спробуйте ще раз за допомогою sudo.

  • -gЗабезпечує глобальну установку і необхідно поставити flsу вашій системі $PATH.

Встановлення вручну

  • Завантажте цей bashсценарій якfls .
  • Зробіть його виконуваним за допомогою chmod +x fls .
  • Перемістіть його або позначте посилання в папку у вашому $PATH, наприклад /usr/local/bin(macOS) або /usr/bin(Linux).

1
Блискуче. Навіть якщо це передбачає створення іншого сценарію. Я скопіював і вставив із текстового джерела, на яке ви посилаєтесь, у текстовий файл, і запустив його в Cygwin за допомогою цієї команди: fls.sh f * .png> pngs.txt І бінго: список файлів .png без шляхів. Але насправді, ls не має опції, порівнянної з перемикачем "dir / b" DOS? Я переглянув вміст ls '--help виводу, і нічого подібного там, принаймні, немає.
Алекс Холл

1
@AlexHall: Дякую; tl; dr: try -1(номер один); lsфактично за замовчуванням має "голий" вихід, тобто лише імена файлів, але при виведенні в термінал використовується макет на основі стовпців (кілька імен файлів у рядку). Щоб отримати одне ім'я файлу на вихідний рядок (що саме dir /bробить, якщо пам'ять служить), використовуйте -1опцію, яка фактично неявно вмикається, коли stdout не підключений до терміналу, наприклад, під час надсилання до конвеєра або вихідного файлу.
mklement0

2

Перелік вмісту деякого каталогу без підкаталогів

Мені подобається використовувати lsваріанти, для зразка:

  • -l використовувати довгий формат списку
  • -t сортувати за часом модифікації, спочатку новітній
  • -r зворотний порядок під час сортування
  • -F, --classify додати індикатор (один із * / => @ |) до записів
  • -h, --human-readable з -l та -s, розміри друку, такі як 1K 234M 2G тощо ...

Десь --colorі всі інші. (Подивитисяls --help )

Перерахування всього, крім папок

Це покаже файли, символьні посилання, пристрої, трубопроводи, розетки тощо.

тому

find /some/path -maxdepth 1 ! -type d

можна легко відсортувати за датою:

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

Файли з перелікомЛише :

або

find /some/path -maxdepth 1 -type f

відсортовані за розміром:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

Запобігання переліку прихованих записів :

Щоб не показувати приховані записи, де ім’я починається крапкою, ви можете додати ! -name '.*':

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

Тоді

Ви могли б замінити /some/pathна .в список для поточного каталогу або ..для батьківського каталогу .


1

Ви також можете використовувати lsз grepабо egrepі розмістити його у своєму профілі як псевдонім:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

Я б не вкладав це в сценарій з наведеної вище причини, а ще одне швидке і брудне рішення: ls -F | grep -v '/ $'
mooie

1

знайти файли: ls -l / home | grep "^ -" | tr -s '' | вирізати -d '' -f 9

знайти каталоги: ls -l / home | grep "^ d" | tr -s '' | вирізати -d '' -f 9

знайти посилання: ls -l / home | grep "^ l" | tr -s '' | вирізати -d '' -f 9

tr -s '' перетворює вихідні дані у файл, розділений пробілом, команда cut вирішує, що роздільник є пробілом, і повертає 9-те поле (завжди ім'я файлу / ім'я каталогу / ім'я посилання).

Я цим увесь час користуюся!


Оце Так! Що робити, якщо імена файлів містять пробіли?
Ф. Хаурі

використовуйте "9-", щоб отримати все з 9-го поля. Це також впливає на посилання, оскільки вони будуть після 9-го поля.
Річард

0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

додано, xargsщоб це працювало, і використовується -1замість того, -lщоб показувати лише імена файлів без додаткової lsінформації


Це має певну перевагу в тому, що воно забезпечує сортування за часом, хоча є, можливо, менш незграбні способи зробити це за допомогоюfind -printf0 '...' | sort -z
tripleee

-2

Просто додавши відповідь Карлпетта. Для набагато кориснішого перегляду файлів ви можете направити вихідні дані до ls.

find . -maxdepth 1 -type f|ls -lt|less

Показує останні нещодавно змінені файли у форматі списку, дуже корисно, коли ви завантажили багато файлів і хочете побачити незавантажену версію останніх.


3
Це, мабуть, поводиться не так, як ви очікуєте! lsне читає стандартний ввід, тому марно що-небудь передавати ls. Ви сумували xargs?
gniourf_gniourf

Якщо сказати інакше: findкоманда в цій відповіді повністю ігнорується ; загальна команда така сама ls -lt | less, яка не виконує фільтрування типів.
mklement0

1
Хоча з GNU findви могли б це зробити find . -maxdepth 1 -type f -ls. Вона також , здається, працює на Mac OS, хоча я вважаю , -maxdepthі -lsнеправильно портативні варіанти.
триплеє

-2

"find '-maxdepth'" не працює з моєю старою версією bash, тому я використовую:

для f в $ (ls); робити якщо [-f $ f]; потім echo $ f; fi; зроблено


Використання for f in $(ls)вдвічі неправильніше. Ви можете виправити це за допомогою, for f in *але тоді це зламається, тому що ви не цитуєте аргументecho .
триплеє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.