117

如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:我怎样才能只列出文件?

4

11 回答 11

163

使用find

find . -maxdepth 1 -type f

使用该-maxdepth 1选项可确保您仅查看当前目录(或者,如果您将 替换为.某个路径,则该目录)。如果您想要该目录和子目录中所有文件的完整递归列表,只需删除该选项即可。

于 2012-05-13T20:06:35.503 回答
29
ls -p | grep -v /

ls -p 让您在文件夹名称之后显示 /,它充当您删除的标签。

于 2017-09-09T22:03:13.280 回答
6
  • carlpett 的find基于答案( find . -maxdepth 1 -type f) 原则上有效,但与使用不完全相同ls:您会得到一个可能未排序的文件名列表,所有前缀都是./,并且您失去了应用ls许多选项的能力;
    find 总是会找到隐藏的项目,而ls' 的行为取决于-aor-A选项的存在与否。

    • Alex Hall在对该问题的评论中建议的一项改进是shell globbingfind

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • 然而,虽然这解决了前缀问题并为您提供按字母顺序排序的输出,但您仍然无法(内联)控制隐藏项的包含,也无法访问ls的许多其他排序/输出格式选项。
  • Hans Roggeman 的ls+grep答案是务实的,但会锁定您使用 long ( -l) 输出格式


为了解决这些限制,我编写了fls( filtering ls ) 实用程序

  • 提供输出灵活性ls同时还提供类型过滤功能的实用程序,
  • 只需在参数列表之前放置类型过滤字符,例如f文件、d目录和l符号链接ls(运行fls --helpfls --man了解更多信息)。

例子:

fls f        # list all files in current dir.
fls d -tA ~  #  list dirs. in home dir., including hidden ones, most recent first
fls f^l /usr/local/bin/c* # List matches that are files, but not (^) symlinks (l)

安装

支持的平台

  • npm 注册表安装时:LinuxmacOS
  • 手动安装时:任何带有Bash的类 Unix平台

npm 注册表

注意:即使你不使用 Node.js,它的包管理器npm也可以跨平台工作并且易于安装;尝试
curl -L https://git.io/n-install | bash

安装Node.js后,按如下方式安装:

[sudo] npm install fls -g

注意

  • 是否需要sudo取决于你如何安装 Node.js/io.js 以及你后来是否更改了权限;如果出现EACCES错误,请使用 重试sudo

  • -g确保全局安装,并且需要放入fls系统的$PATH.

手动安装

  • 将此bash脚本下载为fls.
  • 使其可执行chmod +x fls
  • 将其移动或符号链接到您的文件夹中$PATH,例如/usr/local/bin(macOS) 或/usr/bin(Linux)。
于 2015-06-03T11:35:56.197 回答
5

列出某个目录的内容,不包括子目录

我喜欢使用ls选项,例如:

  • -l 使用长列表格式
  • -t 按修改时间排序,最新的在前
  • -r 排序时倒序
  • -F,--classify 将指示符(*/=>@| 之一)附加到条目
  • -h--human-readable 使用 -l 和 -s,打印尺寸,如 1K 234M 2G 等...

有时--color和所有其他人。(见ls --help

列出除文件夹以外的所有内容

这将显示文件、符号链接、设备、管道、套接字等。

所以

find /some/path -maxdepth 1 ! -type d

可以很容易地按日期排序:

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +

仅列出文件

或者

find /some/path -maxdepth 1 -type f

按大小排序:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +

防止列出隐藏条目

要不显示名称以点开头的隐藏条目,您可以添加! -name '.*'

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +

然后

您可以替换/some/path.列出当前目录目录..

于 2020-04-22T06:21:12.117 回答
2

查找文件:ls -l /home | grep "^-" | tr -s ' ' | 剪切-d''-f 9

查找目录: ls -l /home | grep "^d" | tr -s ' ' | 剪切-d''-f 9

查找链接: ls -l /home | grep "^l" | tr -s ' ' | 剪切-d''-f 9

tr -s ' ' 将输出转换为以空格分隔的文件 cut 命令表示分隔符是空格,并返回第 9 个字段(始终是文件名/目录名/链接名)。

我经常用这个!

于 2020-03-27T22:49:41.290 回答
1

您还可以使用lswith greporegrep并将其作为别名放入您的个人资料中:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'
于 2014-01-21T13:10:46.163 回答
0
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

添加xargs以使其正常工作,并用于-1代替-l仅显示文件名而没有其他ls信息

于 2017-05-19T10:52:19.640 回答
0

不客气!

ls -l | grep '^-'

只是寻找名称,管道到cutor awk

ls -l | grep '^-' | awk '{print $9}'

ls -l | grep '^-' | cut -d " " -f 13
于 2021-08-10T12:38:10.867 回答
0

您可以选择以下之一:

echo *.* | cut -d ' ' -f 1- --output-delimiter=$'\n'
echo *.* | tr ' ' '\n'
echo *.* | sed 's/\s\+/\n/g'
ls -Ap | sort | grep -v /   
于 2022-01-13T15:02:39.850 回答
-2

只是添加到carlpett的答案。要获得非常有用的文件视图,您可以将输出通过管道传输到 ls。

find . -maxdepth 1 -type f|ls -lt|less

以列表格式显示最近修改的文件,当您下载了大量文件并希望查看最近文件的整洁版本时非常有用。

于 2015-03-04T03:58:49.080 回答
-2

“find '-maxdepth'” 不适用于我的旧版本 bash,因此我使用:

对于 $(ls) 中的 f ;如果 [ -f $f ] ; 然后回显 $f ; 菲; 完毕

于 2016-10-12T13:40:47.080 回答