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

23 ответов


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

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

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

find .
find /home/dreftymac

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

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

ls -ld $(find .)

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

ls -ltd $(find .)


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

find "$PWD"

лучшие команды: 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

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

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

find "$PWD" -type f

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

find "$PWD" -type d

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

find "$PWD"

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


использование внешних команд, кроме ls:

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


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


du -a

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


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

find -D tree /fullpath/to-dir/ 

(или для того, чтобы сохранить его в txt-файле)

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

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

du

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

du | awk '{print }'

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


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

find -type f | xargs ls -1


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

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

объяснение:

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

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

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


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

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

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

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


ls -lR Это то, что вы ищете, или, по крайней мере, я был. ура!--2-->


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

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

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

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

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


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

#!/bin/bash

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

tar cf - $PWD|tar tvf -             

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

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

@ghostdog74: Небольшая настройка с вашим решением.
Следующий код может использоваться для поиска файла с полным абсолютным путем.

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

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

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

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


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

ls -lR /path/I/need