Команда ls: как я могу получить рекурсивный список полного пути, по одной строке на файл?

Как я могу заставить 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 почти делает то, что мне нужно, но мне не нужны фрагменты пути, мне нужны полные пути.

Ответ 1

Если вы действительно хотите использовать ls, отформатируйте его вывод с помощью awk:

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

Ответ 2

Используйте find:

find .
find /home/dreftymac

Если вы хотите только файлы (опускать каталоги, устройства и т.д.):

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

Ответ 3

ls -ld $(find .)

если вы хотите отсортировать свой результат по времени модификации:

ls -ltd $(find .)

Ответ 4

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

find "$PWD"

Ответ 5

Лучшая команда: tree -fi

Чтобы использовать файлы, но не ссылки, вам нужно удалить > из вашего вывода:

tree -fi |grep -v \>

Если вы хотите узнать природу каждого файла (например, для чтения только файлов ASCII) с двумя while s:

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

Ответ 6

О, действительно длинный список ответов. Это очень помогло и, наконец, я создал свой собственный, который я искал:

Чтобы вывести список всех файлов в каталоге и его подкаталогах:

find "$PWD" -type f

Чтобы вывести список всех каталогов в каталоге и его подкаталогах:

find "$PWD" -type d

Чтобы вывести список всех каталогов и файлов в каталоге и его подкаталогах:

find "$PWD"

Ответ 7

Я не знаю о полном пути, но вы можете использовать -R для рекурсии. Кроме того, если вы не согнуты на ls, вы можете просто сделать find *.

Ответ 8

Использование внешних команд, отличных от ls:

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

Ответ 9

du -a

Удобен для некоторых ограниченных оболочек устройств, где find/locate недоступны.

Ответ 10

найдите/сделайте трюк

Ответ 11

Я думаю, что для плоского списка лучший способ:

find -D tree /fullpath/to-dir/ 

(или для сохранения в файле txt)

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

Ответ 12

Самый простой способ для всех ваших будущих людей - просто:

du

Это, однако, также показывает размер содержимого, содержащегося в каждой папке Вы можете использовать awk для вывода только имени папки:

du | awk '{print $2}'

Извините, извините, мое плохое. Я думал, что это были только папки, которые были нужны. Я оставляю это здесь, если кто-то в будущем нуждается в этом в любом случае...

Ответ 13

Имея свободу использования всех возможных опций ls:

find -type f | xargs ls -1

Ответ 14

Не усложняйте. Я просто использовал это и получил прекрасный результат:

ls -lR /path/I/need

Ответ 15

Вот частичный ответ, который показывает имена каталогов.

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

Пояснение:

ls -mR * перечислены полные имена каталогов, заканчивающиеся на ':', а затем перечисляются файлы в этом каталоге отдельно

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

Итерируя по списку каталогов, мы также сможем найти каталоги. Все еще работаю над этим. Это вызов для получения подстановочных знаков через xargs.

Ответ 16

Запустите команду bash со следующим форматом:

find /path -type f -exec ls -l \{\} \;

Ответ 17

Добавление подстановочного знака в конец каталога 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

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

Ответ 18

ls -lR - это то, что вы искали, или, по крайней мере, я был. приветствия

Ответ 19

Множество ответов, которые я вижу. Это мое, и я считаю весьма полезным, если вы работаете на Mac.

Я уверен, что вы знаете, что есть некоторые файлы "bundle" (.app,.rtfd,.workflow и т.д.). И, глядя на окно Finder, они кажутся одиночными файлами. Но это не так. И $ ls или $ find рассматривают их как каталоги... Итак, если вам не нужно также перечислить их содержимое, это работает для меня:

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

Конечно, это для рабочего каталога, и вы можете добавить расширения других пакетов (но всегда с / после них). Или любые другие расширения, если они не связаны без /.

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

Ответ 20

Если каталог передается как относительный путь, и вам нужно будет преобразовать его в абсолютный путь до вызова find. В следующем примере каталог передается как первый параметр в script:

#!/bin/bash

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

Ответ 21

tar cf - $PWD|tar tvf -             

Это медленно, но работает рекурсивно и печатает как каталоги, так и файлы. Вы можете передать его с помощью awk/grep, если вам просто нужны имена файлов без всех других info/каталогов:

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

Ответ 22

@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]

Ответ 23

Я знал имя файла, но хотел также его найти.

найти $PWD | fgrep имя_файла

отлично работал в Mac OS 10.12.1