仅列出当前目录中的常规文件(但不列出目录)

dan*_*ann 150 ls shell wildcards files

我可以ls -ld */用来列出当前目录中的所有目录条目。有没有类似的简单方法来列出当前目录中的所有常规文件?我知道我可以使用 find

find . -maxdepth 1 -type f
Run Code Online (Sandbox Code Playgroud)

或统计

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-
Run Code Online (Sandbox Code Playgroud)

但这些并没有让我觉得过于优雅。有没有一个很好的简短方法来只列出常规文件(我不关心设备、管道等)而不是当前目录的子目录?列出符号链接也是一个加分项,但不是必需的。

小智 197

ls -p | grep -v / 
Run Code Online (Sandbox Code Playgroud)

此命令列出所有不是目录的非隐藏文件(常规文件、链接、设备文件等)。要还包括隐藏文件,请将-A选项添加到ls

它假定所有文件的名称中都没有换行符。添加一个-q选项 tols会将所有不可打印的字符(包括换行符)转换为?,保证它们在一行上,因此适合提供给基于行的实用程序,例如grep在终端上打印。

  • +1,这是一个很好的答案。对没有评论的新用户投反对票对我来说非常令人震惊,尤其是当提供了有效的答案时。我可以看到这将无法正常工作的唯一边缘情况是文件名中是否有换行符。在支持的情况下,保留颜色也是一个很好的补充。对于 GNU,你可以将 `--color=always` 添加到 `ls`,对于 OSX`-G`。 (15认同)
  • 如果您还想排除指向目录的符号链接,请执行 `ls -pL | grep -v /`. 添加的`-L` 取消引用符号链接。 (3认同)

Ulr*_*gel 39

使用zshGlob 限定符,您可以轻松地直接表达它,例如:

echo *(.)
Run Code Online (Sandbox Code Playgroud)

将仅返回常规文件列表或错误,具体取决于您的配置。

对于非目录:

echo *(^/)
Run Code Online (Sandbox Code Playgroud)

(将包括符号链接(包括到目录)、命名管道、设备、套接字、门......)

echo *(-.)
Run Code Online (Sandbox Code Playgroud)

用于常规文件和到常规文件的符号链接。

echo *(-^/)
Run Code Online (Sandbox Code Playgroud)

对于非目录,也没有指向目录的符号链接。

另外,D如果要包含D ot 文件(隐藏文件),例如*(D-.).


ken*_*orb 27

仅列出常规文件:

ls -al | grep '^-'
Run Code Online (Sandbox Code Playgroud)

包括符号链接(到任何类型的文件):

ls -al | grep '^[-l]'
Run Code Online (Sandbox Code Playgroud)

其中列表的第一个字符描述了文件的类型,因此-意味着它是一个常规文件,因为符号链接是l.

Debian/Ubuntu

打印所有匹配文件的名称(包括链接):

run-parts --list --regex . .
Run Code Online (Sandbox Code Playgroud)

使用绝对路径:

run-parts --list --regex . "$PWD"
Run Code Online (Sandbox Code Playgroud)

打印以/etc开头p和结尾的所有文件的名称d

run-parts --list --regex '^p.*d$' /etc
Run Code Online (Sandbox Code Playgroud)


cas*_*cas 17

ls没有选择这样做,但是 unix 和 linux 的好处之一是冗长和不雅的管道可以很容易地变成 shell 脚本、函数或别名。反过来,这些可以像任何其他程序一样在管道中使用。

(注意:函数和别名存在一些范围问题。脚本可用于任何可以读取和执行它们的可执行文件。别名和函数仅在当前 shell 中可用 - 尽管子 shell 的 .profile/.bashrc 等可能会重新定义它们,从而使它们可用。此外,脚本可以用任何语言编写 - 包括 bash/sh、awk、perl、python 和其他语言 - 无论哪种语言最适合工作或您最熟悉)

例如

alias lsf='find . -maxdepth 1 -type f -print0 | xargs -0r ls'

我添加了 xargs 以便您可以使用所有常用ls选项,例如lsf -lrS

因为它使用find,将显示所有通常隐藏的点文件,并且所有文件名都将以 ./ 为前缀 - 这是您会注意到的唯一区别。

您可以排除点文件,! -iname '.*'但随后您必须有两个版本的别名 - 一个显示点文件,一个不显示。

alias lsf2='find . -maxdepth 1 -type f -a ! -iname '\''.*'\'' -print0 | xargs -0r ls'

或者,如果lsf是脚本而不是别名,您可以解析选项(可能使用 getopts 或 /usr/bin/getopt 或类似的),并排除点文件,除非-a存在。


kur*_*rtm 9

bash-4.2$ ls -F | grep -v '[/@=|]$' | more
Run Code Online (Sandbox Code Playgroud)

ls 的 -F 选项将 * 附加到可执行文件、/ 到目录、@ 到符号链接、= 到套接字和 | 到 FIFO。然后,您可以使用 grep 从输出中排除非常规文件字符,您就拥有了这些文件。这将适用于任何 shell,而不仅仅是 zsh。

弱点是:

  1. 任何名称以@,结尾的文件,=|将被排除在外(但无论如何您都不应该拥有名称中包含这些字符的文件)
  2. 这并不排除设备文件或某些系统(如门)上的某些特殊类型的文件。
  3. 您将在任何可执行文件上附加一个星号。这可以通过管道通过 sed 处理以从输出中删除任何 '*' 字符。
  4. 如果文件名包含换行符,则无法正常工作。