是否可以列出以字母开头的所有文件,但不能列出目录?

是否可以列出以字母开头的所有文件,但不能列出目录?

我的家庭作业需要以某种方式获取以该字母开头的所有文件的列表F,我知道这个命令:

ls F*

但它也给了我目录,是否可以只显示实际文件?

答案1

POSIXly:

find . ! -name . -prune -type f -name 'F*'

zsh

print -rl -- F*(.)

答案2

我可以使用 find 命令:

find ./ -name "F*" -type f

-f型意味着您只需要常规文件。

答案3

当然 - 使用find(它不像ls以前那样对名称进行排序,所以我添加了这一点):

find . -type f -maxdepth 1 -name 'F*' |sort |xargs ls -l {} \;

或(如果您只想要名称)

find . -type f -maxdepth 1 -name 'F*' |sort

-maxdepth选项不在POSIX,但既然您用 标记了它bash,我们可以做出一些假设。例如,它适用于操作系统X(人们通常使用的其他平台bash)。

无论如何,不​​管怎样,find都会显示子目录中的文件,这将ls不是不添加-R选项。

一个问题find是它的输出可能包括带有非打印字符(空格等)的文件名。 Linux 和 OSX 都find提供了扩大(不在 POSIX 中)称为-print0,适用于xargs互补延伸-0。那么你可以做这个:

find . -type f -maxdepth 1 -print0 -name 'F*'  |sort -z |xargs -0 ls -l {} \;

或者(如果你想放弃排序功能),你可以直接使用 POSIX:

find . -type f -maxdepth 1 -name 'F*' -exec ls -l {} +

当您想要详细列表时,排序主要是一个问题,但是 POSIX+如果您想要一个排序列表,则不会有帮助,因为名称列表中的(仍然合法)换行符会干扰排序。

@cuonglm指出 POSIX 有一个-prune选项,其中表示:

-prune
初级应始终评估为真;如果它是一个目录,它将导致 find 不向下移动当前路径名。

如果您使用“.”对于 的参数find(如此处所示),则不需要该-maxdepth选项。确实如此,但如果我们进一步进行类比ls,那么“。”相当于ls -a,而严格匹配 OP 的问题会删除“-a”选项,并且 的参数可以find是“*”。然而(正如提醒@cuonglm),-prune仅适用于目录,并且find * -prune将匹配目录内容。

还可以使用 shell 通配符扩展,例如,

for n in F*;do [ -f "$n" ] && echo "$n"; done

这(可能)更可取,ls F*因为它不会将非打印字符转换为问号,因此通配符扩展在任何一种情况下都会遇到命令长度限制。

最终,答案取决于OP是否想要清单或一个列表的名字。但无论哪种情况,ls它本身都无法完成这项工作。

相关内容