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

StackOverflow https://stackoverflow.com/questions/1767384

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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) с помощью двух whileс:

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/ 

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

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

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

ls -lR /path/I/need

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

du

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

du | awk '{print $2}'

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

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

find -type f | xargs ls -1

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

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

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

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

Объяснение:

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

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

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

Добавление подстановочного знака в конец каталога 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 это то, что вы искали, или, по крайней мере, я это искал.ваше здоровье

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

Я уверен, вы знаете, что есть несколько «пакетных» файлов (.приложение, .rtfd, .рабочий процесс, и так далее).И если посмотреть в окно 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 $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -             

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top