Ответ 1
Если вы действительно хотите использовать ls
, отформатируйте его вывод с помощью awk:
ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
Как я могу заставить 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 .
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
s:
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/locate недоступны.
найдите/сделайте трюк
Я думаю, что для плоского списка лучший способ:
find -D tree /fullpath/to-dir/
(или для сохранения в файле txt)
find -D tree /fullpath/to-dir/ > file.txt
Самый простой способ для всех ваших будущих людей - просто:
du
Это, однако, также показывает размер содержимого, содержащегося в каждой папке Вы можете использовать awk для вывода только имени папки:
du | awk '{print $2}'
Извините, извините, мое плохое. Я думал, что это были только папки, которые были нужны. Я оставляю это здесь, если кто-то в будущем нуждается в этом в любом случае...
Имея свободу использования всех возможных опций ls:
find -type f | xargs ls -1
Не усложняйте. Я просто использовал это и получил прекрасный результат:
ls -lR /path/I/need
Вот частичный ответ, который показывает имена каталогов.
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
- это то, что вы искали, или, по крайней мере, я был. приветствия
Множество ответов, которые я вижу. Это мое, и я считаю весьма полезным, если вы работаете на 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
, а не кучу вещей...
Если каталог передается как относительный путь, и вам нужно будет преобразовать его в абсолютный путь до вызова find. В следующем примере каталог передается как первый параметр в script:
#!/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, если вам просто нужны имена файлов без всех других info/каталогов:
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