如何只列出文件而不是目录Bash的目录?

Rod*_*igo 69 bash file-listing

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

car*_*ett 91

使用find:

find . -maxdepth 1 -type f
Run Code Online (Sandbox Code Playgroud)

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

  • mac 上的`find` 既没有`-type` 也没有`-maxdepth` 选项。 (2认同)
  • @Tim:`-type`和`-maxdepth`不是正常意义上的_options_;BSD `find`(在 OS X 上使用)将它们称为_primaries_,并且它们必须位于文件名操作数之后(在本例中为`.`;请注意,与 Linux 上不同,BSD 版本需要至少一个显式文件名操作数);这个答案中的命令绝对适用于 Mac。 (2认同)
  • 将 `find * -maxdepth 0 -type f` (从 @AlexHall 的评论派生的替代方案)与 `find 进行对比。-maxdepth 1 -type f` 来自答案:“find . ...` 总是包含隐藏项,总是在输出文件名前加上 `./` 前缀,并且使用 GNU `find` (Linux),通常会输出未排序的列表。`find * ...`,由于让 _shell_ 预先执行通配符,默认情况下排除隐藏项目(可以使用 `shopt -s dotglob` 更改),仅输出文件名(无前缀),按字母顺序排序。这两种方法都不包含文件的符号链接;使用选项“-L”来执行此操作。 (2认同)

Dr_*_*ope 7

ls -p | grep -v /
Run Code Online (Sandbox Code Playgroud)

ls -p使您可以在文件夹名称后显示/,该文件夹名称充当您要删除的标签。


F. *_*uri 7

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

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

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

有时--color和其他所有时间。(看ls --help

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

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

所以

find /some/path -maxdepth 1 ! -type d
Run Code Online (Sandbox Code Playgroud)

可以轻松地按日期排序:

find /some/path -maxdepth 1 ! -type d -exec ls -hltrF {} +
Run Code Online (Sandbox Code Playgroud)

仅列出文件:

或者

find /some/path -maxdepth 1 -type f
Run Code Online (Sandbox Code Playgroud)

按大小排序:

find /some/path -maxdepth 1 -type f -exec ls -lSF --color {} +
Run Code Online (Sandbox Code Playgroud)

防止列出隐藏条目

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

find /some/path -maxdepth 1 ! -type d ! -name '.*' -exec ls -hltrF {} +
Run Code Online (Sandbox Code Playgroud)

然后

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


mkl*_*nt0 5

  • find基于carlpett的答案find . -maxdepth 1 -type f)在原理上有效,但与使用的ls./ls含义不同:您会得到一个可能未排序的文件名列表,都带有前缀,并且失去了应用多个选项的能力
    find 总是查找隐藏的项目,而ls'的行为取决于-aor -A选项的存在与否。

    • 亚历克斯·霍尔Alex Hall)在对该问题的评论中提出了一项改进,那就是Shell Globing以下各项组合find

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      Run Code Online (Sandbox Code Playgroud)
      • 但是,尽管这解决了前缀问题并为您提供了按字母顺序排序的输出,但是您仍然(无法)控制隐藏项的包含,也无法访问ls的许多其他排序/输出格式选项。
  • 汉斯·罗格曼(Hans Roggeman)的ls+ grep回答很实用,但是使-l无法使用long()输出格式


为了解决这些局限性,所以我写的fls˚F iltering 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)
Run Code Online (Sandbox Code Playgroud)

安装

支持平台

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

npm注册表

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

随着Node.js的安装,安装如下:

[sudo] npm install fls -g
Run Code Online (Sandbox Code Playgroud)

注意事项

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

  • -g确保全球安装,并需要把fls你的系统$PATH

手动安装

  • 将该bash脚本下载为fls
  • 使用使其可执行chmod +x fls
  • 将其移动或符号链接到您的中的文件夹$PATH,例如/usr/local/bin(macOS)或/usr/bin(Linux)。