列出文件时如何排除目录?


Answers:



15

要使其完全等同于ls .您,无需显示隐藏的目录。

find . -maxdepth 1 -not -type d -and -not -name '.*'

仍然会给每个文件名加上前缀“ ./”。这并不是真正的问题,但我认为这很丑陋。我去了:

ls -p | grep -v '/$'

这将为您提供看起来相同的清单,您也可以添加其他ls参数。添加--color=always,您将获得dircolors,或-a查看隐藏的文件。

我喜欢Alexander的回答,因为他实际上取决于所讨论文件的文件系统特性,因此永远不会被愚弄。我的答案将被名称中最后一个字符“ /”的文件所欺骗。但这似乎是在自找麻烦。


1
'-not'与GNU find相关,因为它不符合POSIX,所以最好不要教这些选项,因为用户可能有“不好的”习惯,并在其他UNIX上感到迷失:)
jirib 2012年

2
@JiriXichtkniha是-not的POSIX替代品是什么?
卢卡斯·加林多

5

尝试这个:

$查找。型f -maxdepth 1

或这个:

$ ls -p | egrep -v / $

$ ls -la | egrep -v ^ d


3

虽然这是一个旧帖子,但我认为这可能会有所帮助。

$ ls -l | grep -v ^ d

它将列出所有文件,包括符号链接,字符和阻止文件。


这个答案已经在一年前由jamzed提供((发出这种视觉声音)。)
Alexx Roche

2

上面的“查找”解决方案失去了ls的某些功能-例如:仅列出文件,并按修改时间降序排列。

如果需要,“ ls -p | grep”答案不会优雅地处理ls的其他元素,例如-R

我认为以下答案较为冗长,反映了ls的真实行为和选择“仅文件”的最大灵活性

ls -t . | while read line; do
  if [ -f $line ]; then
    echo $line
  fi 
done

只需根据需要更换ls开关,结果将仅返回文件。如果还需要链接和其他项目,则需要对测试进行少量修改才能包含在内。


0
ls $(file --no-pad  -F' '  * | grep -v directory | cut -d' ' -f1)

这样,您仍然可以使用ls通常需要的任何其他选项。或者...删除-v以仅列出目录。或者...用任何其他可以file理解和报告的文件类型替换目录,例如ASCII,空,ELF等。


如果要列出的任何文件名包含空格,则此方法不起作用。
Psychonaut

ls -t .|while read f;do [ -f "$f" ]&& echo $f;done在我的测试中快了大约3倍
Alexx Roche

0

我在find二进制不支持的系统上,-not最终使用了:

ls|while read f;do [ -f "$f" ]&& echo $f;done

优点:不依赖于除sh ls echo
与bash和破折号兼容之外的任何内容,
可以通过更改以使其匹配其他内容(例如目录),从而-f
比某些答案更快,并且使用更少的RAM和CPU

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.