ls ~ -R
如何使用command在当前目录中找到最长路径(包含最多子目录)的目录
答案1
GNU可以使用其谓词的格式说明符find
输出找到的名称的深度:%d
-printf
find . -type d -printf '%d\t%p\n'
这将输出当前目录中或当前目录下找到的目录的深度,以及相对于.
搜索路径的目录路径名。深度和路径名由单个制表符分隔。
\0
假设路径名可能包含换行符,为了正确地将这些信息传递给其他工具进行排序等。用 来代替\n
格式字符串的末尾会更安全。然后,您可以使用 GNU 对生成的以 null 结尾的列表进行排序,并使用 GNU和 GNUsort
选出深度最大的路径名。如果您将非标准选项传递给这些工具的 GNU 变体,则它们都能够处理以 null 结尾的记录,而标准工具都可以处理文本行。tail
cut
-z
find . -type d -printf '%d\t%p\0' | sort -z -n | tail -z -n 1 | cut -z -f 2-
Finalcut
删除了从字符串开头开始的数字深度。
这将在标准输出上为您提供一个以 null 结尾的字符串,其中包含当前目录下最长(最深)的目录路径名。如果有多个相同深度的路径名,这将为您提供按字典顺序对最后一个进行排序的路径名。
答案2
以下内容将假设您的目录名称不包含换行符。如果是这种情况,则以下操作将起作用:
find . -type d | awk -F'/' 'NF>max{longest=$0;max=NF} END{if (max) print longest}'
这将用于find
搜索当前目录的所有子目录。它将输出提供给awk
,并将字段分隔符设置为/
,以标识具有最大数量字段(= 路径组件)的输入字符串。该输入字符串(如果有)会在最后打印。
答案3
当然,解析 的输出ls
通常是不受欢迎的,但如果你真的想用 来做到这ls -R
一点,比如
ls -R ~ | grep '/' | while read var ; do
res="${var//[^/]}"
echo "${#res} $var"
done | sort -n | sed 's/^[^ ]* //' | tail -1
应该管用。
注意:这远非万无一失。如果您有复杂的目录名称(例如/
名称中的换行符或 a ),此脚本将严重失败。