ls команда: як я можу отримати рекурсивний список повного контуру, один рядок у файлі?


493

Як я можу змусити ls виплюнути плоский список рекурсивних контурів один на рядок?

Наприклад, мені просто хочеться перерахувати файли з повним контуром:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 майже робить те, що мені потрібно, але я не хочу фрагментів шляху, я хочу повноцінних шляхів.


Дивіться також: дерево
dreftymac

Відповіді:


386

Якщо ви дійсно хочете використовувати ls, відформатуйте його вихід за допомогою awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac, це означає, що це, об’єктивно кажучи, правильна відповідь на запитання, яке ви написали, навмисно чи ні. Так, можливо, це була не правильна відповідь на питання, яке ви сподівалися написати. І хоча я погоджуюся з вашим більшим моментом: "коли мудрий вказує на Місяць, дурень дивиться на палець", справедливо, ми мінімізуємо вплив суб'єктивності для оцінки правильності, особливо коли критерії не мають жодної можливої ​​двозначності.
lurscher

1
@dreftymac, я буду радий змінити свій голос, але він зараз заблокований, вам потрібно відредагувати питання, щоб я міг оновити голосування
lurscher

7
Може хтось, будь ласка, пояснить наведені вище awkвирази?
Мерт Нухоглу

2
Це рішення не опускає каталогів (кожен каталог отримує свій рядок)
JayB

2
Дякую. Btw, було б добре мати це в 1 рядку для швидкого копіювання та вставки.
Лев Уфімцев

567

Використовуйте знахідку:

find .
find /home/dreftymac

Якщо ви хочете лише файли (опустіть каталоги, пристрої тощо):

find . -type f
find /home/dreftymac -type f

2
Чи можуть lsтакі параметри, як --sort=extension"викуплено" цим рішенням?
n611x007

Ви навіть можете використовувати висновок printf, щоб відобразити потрібну контекстну інформацію (наприклад, знайти. -Тип f -printf '% p% u \ n')
xsubira

Чи можна це відформатувати фальгом? тобто. python pprint.pprint (files)
Натан

72

ls -ld $(find .)

якщо ви хочете сортувати свої результати за часом модифікації:

ls -ltd $(find .)


11
-bash: / bin / ls: Список аргументів занадто довгий
jperelli

1
+1 працював на мене з 12106 файлами, і я міг використовувати --sort=extensionпараметрls
n611x007

3
Дякую. Я б сам не подумав про цей (хороший і короткий) синтаксис - я би використав find . -name "*" -exec ls -ld '{}' \;(що працює незалежно від кількості файлів), але ваша команда написана набагато коротше;)
SRG

1
ls -ld $ (find.) перерви для мене, якщо я перераховую диск ntfs, де у файлах є пробіли: ls: не вдається отримати доступ ./System: Немає такого файлу чи каталогу, однак знайти з цитатами @SRG працює
kuz8

Коротша альтернатива (залежно від ваших потреб) була б find . -ls.
IanS

59

Спробуйте наступний простіший спосіб:

find "$PWD"

9
find "`pwd`"якщо шлях містить пробіли чи якісь інші спеціальні символи.
mustafa.0x

7
Чим це відрізняється find .? -.-
Салман фон Аббас

7
@SalmanPK Якщо ви знайдете абсолютний шлях, як і pwdдля початку, він надрукує абсолютні шляхи. До речі, "Чим це відрізняється find" ;-)
yckart

44

Найкраща команда: tree -fi

Для того, щоб використовувати файли, але не посилання, вам потрібно видалити >зі свого результату:

tree -fi |grep -v \>

Якщо ви хочете знати природу кожного файлу (для читання лише файлів ASCII, наприклад) з двома whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

Дякую, я не знав про це tree!
Ден Філімон

@Nakilon, що найближче? Він відображає вихід подібним чином? Як би ви легко відобразили подібний вихід за допомогою короткої команди?
om01

6
@ om01: на osx це важко, оскільки brew install tree, якщо ви користуєтеся домашньою мовою
ccpizza

я не міг перерахувати файли виключно. він також завжди містить список каталогів. як я можу це зробити?
kommradHomer

Це слід оцінити набагато вище!
der_grund

44

О, справді довгий список відповідей. Це дуже допомогло, і, нарешті, я створив свою власну, яку шукав:

Щоб перелічити всі файли в каталозі та його підкаталогах:

find "$PWD" -type f

Щоб перерахувати всі каталоги в каталозі та його підкаталогах:

find "$PWD" -type d

Щоб перелічити всі каталоги та файли в каталозі та його підкаталогах:

find "$PWD"

2
І фільтрувати за розширенням:find "$PWD" -type f | grep '\.json$'
Killroy

2
Немає необхідності в пост-обробці grep, використовуйте -name в пошуку типу: знайдіть "$ PWD" -типу f -name * .json і якщо ви хочете видалити перелічені файли: знайдіть "$ PWD" -типу f -name * .json -exec rm {} \; аналогічно, якщо ви хочете скопіювати його, тоді замініть rm на cp та призначення: -exec cp {} призначення
Хрещений батько

18

Я не знаю про повний шлях, але ви можете використовувати -Rдля рекурсії. Крім того, якщо вас не нахиляють ls, ви можете просто зробити find *.


16

Використання жодних зовнішніх команд, крім ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


Невідомий варіант '-1'. Аборти.
ilw

15
du -a

Зручний для деяких обмежених оболонок приладів, де пошук / пошук недоступні.


1
будь-яка ідея, як я можу видалити розмір файлів без цього awk?
Арнольд Роа


10

Не ускладнюйте це. Я просто використав це і отримав прекрасний вихід:

ls -lR /path/I/need

3
ОП хоче просто повного шляху і нічого іншого. ls -lRне досяг би цієї мети.
codeforester

вибачте, це не робиться
Ар'є Бейц

9

Найпростіший спосіб для всіх ваших майбутніх людей - це просто:

du

Це, однак, також показує розмір того, що міститься у кожній папці. Ви можете використовувати awk для виведення лише імені папки:

du | awk '{print $2}'

Редагувати - Вибачте, вибачте. Я думав, що потрібні лише папки. Я залишаю це тут на випадок, якщо комусь у майбутньому це все одно буде потрібно ...


Цікаво, тому що він показує мені речі, про які я не знав, що хотів знати - на кшталт Google. Виявляється, мені подобається знати, скільки місця займає кожен файл.
Джейк Торонто


9

Я думаю, що для плоского списку найкращий спосіб:

find -D tree /fullpath/to-dir/ 

(або для того, щоб зберегти його у файлі txt)

find -D tree /fullpath/to-dir/ > file.txt

3
Пробували на Mac OS 10.13.3. find: illegal option -- D
Jayant Bhawal


6

Ось часткова відповідь, яка показує назви каталогів.

ls -mR * | sed -n 's/://p'

Пояснення:

ls -mR * перераховує повні імена каталогів, що закінчуються на ':', а потім перераховує файли в цьому каталозі окремо

sed -n 's/://p' знаходить лінії, які закінчуються двокрапкою, відкресліть двокрапку та надрукуйте рядок

Повторюючи список каталогів, ми також зможемо знайти каталоги. Ще працюю над цим. Отримати подвійні картки через xargs - це складний виклик.


чудова відповідь .. саме те, що мені було потрібно!
Селвін

5

Додавання підстановки до кінця каталогу ls примушує прокласти повний шлях. Зараз у вас це є:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Ви можете зробити це замість цього:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

На жаль, це не друкує повний шлях для повторних записів каталогів, тому це може бути не повним рішенням, яке ви шукаєте.


Крім того, на жаль, ви не можете надати супровід з wildcard (тому що wildcard розширено як звичайний користувач).
andrew lorien

4

Я бачу багато відповідей. Це моє, і я вважаю досить корисним, якщо ви працюєте на Mac.

Я впевнений, що ви знаєте, що є кілька файлів "пакетів" ( .app , .rtfd , .workflow тощо). І дивлячись у вікно Finder, вони здаються єдиними файлами. Але їх немає. І $ lsчи $ findпобачити їх як каталоги ... Так що , якщо вам не потрібно перераховувати їх вміст , а також, це працює для мене:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Звичайно, це для робочого режиму, і ви можете додати інші розширення в комплекті (але завжди з /після). Або будь-які інші розширення, якщо не без пакета /.

Досить цікавий " .lpdf/" (багатомовний pdf). Він має нормальне " .pdf" розширення (!!) або жодне в Finder. Таким чином ви отримуєте це (або він налічує лише 1 файл) за це, pdfа не купу матеріалів ...


4

ls -lR це те, що ви шукали, або принаймні я був. ура


ОП хоче просто повного шляху і нічого іншого. ls -lRне досяг би цієї мети.
Хадрієн ТОМА

3

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

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

Якщо у вас є система, readlinkви можете зробити цеdirectory=$(readlink -e $1)
Призупинено до подальшого повідомлення.

Щоправда, але комбінація cd / pwd буде працювати в кожній системі. readlinkв OS X 10.5.8 не підтримує опцію -e.
Джон Кейс

3
tar cf - $PWD|tar tvf -             

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

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
ви також можете використовувати просто: tar cvf / dev / null $ PWD
Правило

2

@ ghostdog74: Трохи підправити своє рішення.
Наступний код можна використовувати для пошуку файлу з його повним абсолютним шляхом.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

Я знав ім'я файлу, але хотів і каталог.

знайти $ PWD | fgrep ім'я файлу

відмінно працював у Mac OS 10.12.1

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