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