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

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

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

find . -maxdepth 1 -type f

或统计

stat -c "%F %n" * | grep "regular file" | cut -d' ' -f 3-

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

答案1

ls -p | grep -v / 

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

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

答案2

zsh全球预选赛您可以轻松地直接表达它,例如:

echo *(.)

根据您的配置,将仅返回常规文件列表或错误。

对于非目录:

echo *(^/)

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

echo *(-.)

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

echo *(-^/)

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

另外,D如果您想包含,请参阅 globbing 限定符Dot 文件(隐藏文件),例如*(D-.).

答案3

仅列出常规文件:

ls -al | grep '^-'

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

ls -al | grep '^[-l]'

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

Debian/Ubuntu

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

run-parts --list --regex . .

使用绝对路径:

run-parts --list --regex . "$PWD"

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

run-parts --list --regex '^p.*d$' /etc

答案4

bash-4.2$ ls -F | grep -v '[/@=|]$' | more

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

缺点是:

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

相关内容