如何使用ls仅列出非空文件?


Answers:


46

我用了 find dirname -not -empty -ls,假设GNU找到。


1
任何人都在意解释downvote?
Daenyth

可能是因为提问者要求 ls 你用过 find ;)虽然我提高了......这是一个合适的解决方案
BloodPhilia

1
如果你使用“find.-not -empty -ls”它也会包含当前目录(即它的输出中的“。”),只包括当前文件使用“find.-type f -not -empty -ls”
user672009

17

这是一份工作 ls不够强大。

find -maxdepth 1 -size +0 -print

-maxdepth 1 - 这告诉find只搜索当前目录,删除查看所有子目录或更改数字下降2,3或更多级别。

-size +0 这告诉find查找大小超过的文件 0 字节。 0 可以更改为您想要的任何尺寸。

-print 告诉find打印出它找到的文件的完整路径

编辑:
迟到:你应该也可以添加 -type f 切换到上面。这告诉find只查找文件。正如下面的评论所述, -print 切换不是真的需要。


1
为了避免发出警告,你应该放置 -maxdepth 1 之前 -size +0。也 -print 是默认操作,因此不需要它。
cYrus

@cYrus - 没有警告我(cygwin)
Nifle

实施 find 在有效选项和可用选择方面有很大差异。 GNU find (非常普遍) 如果你把它发出警告 -size 之前 -maxdepth
Telemachus


7

Ls几乎没有筛选文件的选项:这不是它的工作。过滤文件是shell的工作,用于简单的情况(通过globbing)和查找复杂案例的工作。

在zsh中,你可以 L globbing限定符仅保留大小为> 0的文件( . 限定符限制为常规文件):

ls *(.L+0)

其他shell的用户必须使用find。使用GNU find(主要在Linux上找到):

find -maxdepth 1 -type f ! -empty -exec ls {} +

符合POSIX的方式是:

find . -type f -size +0c -exec ls {} + -o -name . -o -prune

如果 ls 不仅仅是一个例子,你只是打算视觉检查,你可以按大小排序: ls -S


5
ls -l | awk '{if ($5 != 0) print $9}'

如果你打算使用 ls,你需要一些帮助 awk


3
 $ find /* -type f ! -size 0

如果你想要所有非空文件而不仅仅是目录,它会更好地工作。


0

Bash 4.0+

shopt -s globstar
shopt -s nullglob
for file in **/*; do  test -f "$file" && [[ -s "$file" ]] && echo "$file"; done
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.