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在终端上打印。
Ulr*_*gel 39
使用zsh和Glob 限定符,您可以轻松地直接表达它,例如:
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.
打印所有匹配文件的名称(包括链接):
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存在。
bash-4.2$ ls -F | grep -v '[/@=|]$' | more
Run Code Online (Sandbox Code Playgroud)
ls 的 -F 选项将 * 附加到可执行文件、/ 到目录、@ 到符号链接、= 到套接字和 | 到 FIFO。然后,您可以使用 grep 从输出中排除非常规文件字符,您就拥有了这些文件。这将适用于任何 shell,而不仅仅是 zsh。
弱点是:
@,结尾的文件,=或|将被排除在外(但无论如何您都不应该拥有名称中包含这些字符的文件)