按字母顺序递归列出文件,并且不包含仅显示文件夹名称的行

按字母顺序递归列出文件,并且不包含仅显示文件夹名称的行

如何按字母顺序递归列出文件,并且不显示专门显示文件夹名称的行?

例如,我可以使用以下命令获得以下输出tree --dirsfirst -fihan * -o filelist

00.-ScriptHookV [1.0.1737.0]
[128K]  00.-ScriptHookV [1.0.1737.0]/dinput8.dll*
[1.2M]  00.-ScriptHookV [1.0.1737.0]/ScriptHookV.dll*
01.-ScriptHookVDotNet [2.10.10]
[ 891]  01.-ScriptHookVDotNet [2.10.10]/LICENSE.txt*
[1.8K]  01.-ScriptHookVDotNet [2.10.10]/README.txt*
[1018K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.dll*
[7.5K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.pdb*
[ 92K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.xml*
[ 34K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet.asi*
02.-Heap Limit Adjuster [1.0.0]
[ 98K]  02.-Heap Limit Adjuster [1.0.0]/GTAV.HeapAdjuster.asi*
03.-OpenIV [3.1]
[132K]  03.-OpenIV [3.1]/OpenIV.asi*
04.-Enhanced Native Trainer [1.41 Update 1]
[ 15M]  04.-Enhanced Native Trainer [1.41 Update 1]/EnhancedNativeTrainer.asi*
[8.4K]  04.-Enhanced Native Trainer [1.41 Update 1]/ent-config.xml*

但我需要这种输出(不一定是文件大小):

[128K]  00.-ScriptHookV [1.0.1737.0]/dinput8.dll
[1.2M]  00.-ScriptHookV [1.0.1737.0]/ScriptHookV.dll
[ 891]  01.-ScriptHookVDotNet [2.10.10]/LICENSE.txt
[1.8K]  01.-ScriptHookVDotNet [2.10.10]/README.txt
[1018K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.dll
[7.5K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.pdb
[ 92K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet2.xml
[ 34K]  01.-ScriptHookVDotNet [2.10.10]/ScriptHookVDotNet.asi
[ 98K]  02.-Heap Limit Adjuster [1.0.0]/GTAV.HeapAdjuster.asi
[132K]  03.-OpenIV [3.1]/OpenIV.asi
[ 15M]  04.-Enhanced Native Trainer [1.41 Update 1]/EnhancedNativeTrainer.asi
[8.4K]  04.-Enhanced Native Trainer [1.41 Update 1]/ent-config.xml

有什么建议么?

答案1

使用zsh外壳:

print -C1 **/*(.DN)

对于zshshell,这会将给定的通配模式扩展为单个列的结果打印出来(这就是所做print -C1的)。该模式扩展到当前目录中或当前目录下的**/*(.DN)所有常规文件(不是目录等;这是 glob 限定符的作用)的路径名。(.)默认情况下,这些将是按字典顺序排列的排序者。 glob限定符分别与 shell 中的设置和(DN)具有相同的效果(即,它使模式匹配隐藏名称,并且如果它不匹配任何内容,也使其根本不扩展)。dotglobnullglobbash

除了(.)列出常规文件之外,还可以用来(^/)列出非目录。

在 中bash,您可以执行类似的操作

shopt -s globstar dotglob nullglob
for pathname in **/*; do
    [[ ! -d $pathname ]] && printf '%s\n' "$pathname"
done

它递归地打印所有非目录(包括隐藏文件)的按字典顺序排序的路径名。

答案2

应该非常便携:

find . -type f | sort

如果您的输入数据包含名称中带有换行符的文件,我相信这应该可以更好地处理它们(感谢 Kusalananda 指出这种可能的情况):

find . -type f -print0 | sort -z | tr '\0' '\n'

答案3

如果您想列出当前目录中所有子目录中的所有文件并按文件名排序,请使用 find 命令。

find . -type f -exec basename {} \; | sort

相关内容