![列出目录下某种类型的文件?](https://linux22.com/image/40718/%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%9F%90%E7%A7%8D%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
如果您只想列出目录(在当前目录中),请使用ls -d */
如果您只想列出普通文件、可执行文件、软链接或任何其他类型的文件,该怎么办?
因为ls -F
附加*
到可执行文件、@
符号链接文件、/
目录,我尝试了
ls -d **
和
ls -d *@
,但它们不起作用。
答案1
您可以使用 中记录的文件测试运算符man test
。例如,要列出符号链接:
for i in *;do if [ -L "$i" ] ;then printf -- "%s\n" "$i";fi;done
答案2
您可以使用find
。
列出所有文件:
find . ! -name . -prune -type f
列出所有符号链接:
find . ! -name . -prune -type l
列出所有可执行文件:
find . ! -name . -prune -type f -perm +111
你可以阅读 POSIX寻找更多高级选项的文档。
答案3
像这样的命令ls -d *@
会列出名称以@
.该@
字符是文件名必须匹配的模式的一部分。当ls -F
在文件名后显示一个字符时,该字符不是文件名的一部分,它是添加的额外指示ls
(这就是该选项的要点-F
)。
ls
没有选择要列出的文件类型的选项。如果您的文件名不包含特殊字符(例如换行符或ls -F
添加的后缀),您可以使用ls -F
列出某些类型的文件并过滤其输出。例如,要列出当前目录中的符号链接,您可以使用
ls -F | grep '@$'
列出选定类型的文件的更可靠方法是使用find
命令。与 不同ls
,find
是递归的;使用该-prune
操作来停止递归。另一个区别是,find
不会特殊处理名称以.
(点文件)开头的文件,而是ls
会跳过它们,shell 模式也会*
跳过它们。例如,以下命令列出当前目录中的符号链接:
find . -name . -o -type l -print -o -prune
执行过滤的另一种方法是循环遍历所有文件并进行测试以选择所需的文件。
for x in *; do
if [ -L "$x" ]; then echo "$x"; fi
done
在 zsh 中,您可以使用全局限定符按类型限制文件。例如,以下 zsh 命令列出当前目录中的符号链接:
print -rl *(@)
答案4
假设您只想在列表中查看 c 源文件(后缀 .c):
ls -l *.c
这将列出所有 C 代码文件。
享受