Реальный вопрос должен быть: почему ls -dRне работает?
mastaBlasta
Реальный вопрос должен включать описание «работы», чтобы мы могли ответить, почему ls -dR«не работает». ls -dRфактически делает то, что говорится в документации: «-d Каталоги перечислены как простые файлы (не ищутся рекурсивно)». ls -Rс другой стороны , список подкаталогов рекурсивно.
LarsH
Ответы:
64
Предполагая, что вы просто хотите имя каждого каталога:
+1. Кстати, аргумент -print не обязателен - он используется по умолчанию. также, если требуется определенный формат листинга, он может быть передан в xargs для запуска ls с любыми желаемыми опциями, например find /path/ -type d -print0 | xargs -0 -r ls -ld. Обратите внимание на -print0 для завершенного вывода NULL и соответствующий аргумент -0 xargs.
Cas
И если вы случайно запускаете это в Windows и Cygwin, то в Windows уже есть findкоманда, поэтому вам, вероятно, следует указать путь к папке bin Cygwin.
phyatt
12
Я искал то же самое в прошлом и нашел это:
tree.sh
#!/bin/sh
#######################################################
# UNIX TREE
# Version: 2.3
# File: ~/apps/tree/tree.sh
#
# Displays Structure of Directory Hierarchy
# -------------------------------------------------
# This tiny script uses "ls", "grep", and "sed"
# in a single command to show the nesting of
# sub-directories. The setup command for PATH
# works with the Bash shell (the Mac OS X default).
#
# Setup:
# $ cd ~/apps/tree
# $ chmod u+x tree.sh
# $ ln -s ~/apps/tree/tree.sh ~/bin/tree
# $ echo "PATH=~/bin:\${PATH}" >> ~/.profile
#
# Usage:
# $ tree [directory]
#
# Examples:
# $ tree
# $ tree /etc/opt
# $ tree ..
#
# Public Domain Software -- Free to Use as You Like
# http://www.centerkey.com/tree - By Dem Pilafian
#######################################################
echo
if [ "$1" != "" ] #if parameter exists, use as base folder
then cd "$1"
fi
pwd
ls -R | grep ":$" | \
sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
# 1st sed: remove colons
# 2nd sed: replace higher level folder names with dashes
# 3rd sed: indent graph three spaces
# 4th sed: replace first dash with a vertical bar
if [ `ls -F -1 | grep "/" | wc -l` = 0 ] # check if no folders
then echo " -> no sub-directories"
fi
echo
exit
Я хотел тот, который перечислил файлы также, и я узнал о sed и написал это:
fulltree.sh
#!/bin/sh
#############################################
# Script that displays a recursive formatted folder and file listing
# @author Corbin
# @site iamcorbin.net
#Folder Seperator
BREAK='-------------------------------------------------------------------------------------'
#Optional: if a folder is passed as an argument, run fulltree on that folder rather than the current folder
if [ "$1" != "" ]
then cd "$1"
fi
pwd
## Recursive Directory Listing with files
# 1- preserve directories from being removed in 2 & 3
# 2- strip first 4 columns
# 3- strip size and date
# 4- prepend ' -- ' on each line
# 5- remove ' -- ' from directories
# 6- remove extra lines
# 7- Insert a line break after directories
# 8- Put a | at the beginning of all lines
# 9- Indent and process 1st level sub dirs
#10- Indent and process 2nd level sub dirs
ls -Rhl | sed \
-e 's/^\.\//x x x x 00:00 |-/' \
-e 's/^\([^\ ]*.\)\{4\}//' \
-e 's/.*[0-9]\{2\}:[0-9]\{2\}//' \
-e 's/^/ -- /' \
-e 's/\ \ --\ \ |-//' \
-e '/--\ $/ d' \
-e '/^[^ ]/ i\'$BREAK \
-e 's/^/| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^|/\t&/' -e '/^\t/,/'$BREAK'/ s/'$BREAK'/\t&/' -e 's/[^/]*\//\t\| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^\t|/\t&/' -e '/^\t\t/,/'$BREAK'/ s/'$BREAK'/\t&/' -e 's/[^/]*\//\t\t\| /' \
| sed -e '/[^/]*\//,/'$BREAK'/ s/^\t\t/\t&/' -e 's/[^/]*\//\t\t\t\| /'
echo $BREAK
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"обновление для tree.sh, которое я сделал для обработки некоторых крайних случаев, последнее по адресу: centerkey.com/tree
Дем Пилафян
9
Вы можете получить пакет "tree", в ArchLinux и Ubuntu он называется "tree"
Так что, если вы находитесь в ~ /, вы можете сделать tree -dи получить полный список каталогов (в древовидной структуре) для всего, что находится в ~ /
Мне нужен простой текст, список подкаталогов, разделенный новой строкой, в то время как дерево, кажется, добавляет свою «древовидную» структуру. И я не могу найти флаг, чтобы отключить его.
Немо
2
@ Capt.Nemo: Для простого перечисления используйте: tree -dfi ... вы можете добавить, --noreportчтобы подавить окончательное отображение общего количества каталогов .
Peter.O
3
ОП не указывает, какой формат вывода они хотят (кроме «простого перечисления подпапок»).
Опция globstarактивируется **.
Опция nullglobудаляет *, который ничего не соответствует.
Возможность dotglobвключить файлы, начинающиеся с точки (скрытые файлы)
ls -dR
не работает?ls -dR
«не работает».ls -dR
фактически делает то, что говорится в документации: «-d Каталоги перечислены как простые файлы (не ищутся рекурсивно)».ls -R
с другой стороны , список подкаталогов рекурсивно.Ответы:
Предполагая, что вы просто хотите имя каждого каталога:
источник
find /path/ -type d -print0 | xargs -0 -r ls -ld
. Обратите внимание на -print0 для завершенного вывода NULL и соответствующий аргумент -0 xargs.find
команда, поэтому вам, вероятно, следует указать путь к папке bin Cygwin.Я искал то же самое в прошлом и нашел это:
tree.sh
Я хотел тот, который перечислил файлы также, и я узнал о sed и написал это:
fulltree.sh
источник
ls -R | grep "^[.]/" | sed -e "s/:$//" -e "s/[^/]*[/]/--/g" -e "s/^/ |/"
обновление для tree.sh, которое я сделал для обработки некоторых крайних случаев, последнее по адресу: centerkey.com/treeВы можете получить пакет "tree", в ArchLinux и Ubuntu он называется "tree"
Так что, если вы находитесь в ~ /, вы можете сделать
tree -d
и получить полный список каталогов (в древовидной структуре) для всего, что находится в ~ /источник
tree -dfi
... вы можете добавить,--noreport
чтобы подавить окончательное отображение общего количества каталогов .ОП не указывает, какой формат вывода они хотят (кроме «простого перечисления подпапок»).
При желании удалить трейлинг
:
с помощью|sed -e 's/:$//'
или отформатировать его|awk '{printf("%-92s \n",$0)}'
и т. Д.источник
С
zsh
и глоб-классификаторы :чтобы исключить скрытые каталоги:
источник
Для Баш:
Последний слеш / список только каталогов.
Опция
globstar
активируется**
.Опция
nullglob
удаляет *, который ничего не соответствует.Возможность
dotglob
включить файлы, начинающиеся с точки (скрытые файлы)источник