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

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

171593 次浏览

使用 find:

find . -maxdepth 1 -type f

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

你也可以将 lsgrepegrep一起使用,并将它作为别名放在你的配置文件中:

ls -l | egrep -v '^d'
ls -l | grep -v '^d'

我只是想补充 Carlpett 的回答。 对于非常有用的文件视图,您可以将输出通过管道传送到 ls。

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

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

  • Carlpett 的基于 find的答案 (find . -maxdepth 1 -type f)原则上有效,但是是 与使用 ls不太一样: 您可能会得到一个以 ABC3 为前缀的文件名列表,这样您就失去了应用 ls的许多 < em > 选项 的能力;
    find也是 总是找到隐藏的东西,而 ls的行为取决于 -a-A选项的存在与否。

    • Alex Hall在对问题的评论中建议的 进步是对 将 < em > shell globbing 与 find组合的:

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • 但是,虽然这个 解决前缀问题并按字母顺序给出输出,您仍然没有(内联)控制隐藏项的包含,也没有访问 ls的许多其他排序/输出格式选项。
  • 汉斯 · 罗格曼的 ABC0 + grep答案 是务实的,但 使用 long (-l)输出格式锁定您


为了解决这些限制,我编写了 fls ( f 阉割 ls )效用,

  • 一个提供 ls输出灵活性同时也提供 类型过滤能力类型过滤能力 的实用程序,
  • 只需将 类型过滤字符类型过滤字符(如 ABC0表示文件,ABC1表示目录,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安装时
  • 安装 手动操作时: 使用 巴斯的任何 像 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确保 < em > 通用 安装,是需要把 fls在您的系统的 $PATH

手动安装

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

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

For f in $(ls) ; do if [-f $f ] ; then echo $f; fi; done

{ find . -maxdepth 1 -type f | xargs ls -1t | less; }

增加了 xargs使其工作,并使用 -1而不是 -l只显示文件名没有额外的 ls信息

ls -p | grep -v /

Ls-p 允许在文件夹名称后显示/,该名称充当要删除的标记。

查找文件: ls-l/home | grep“ ^-”| tr-s’’| cut-d’’-f9

查找目录: ls-l/home | grep“ ^ d”| tr-s’’| cut-d’-f9

查找链接: ls-l/home | grep“ ^ l”| tr-s’’| cut-d’-f9

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

我经常用这个!

列出一些目录的内容,没有子目录

我喜欢使用 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,列出 工作目录..,列出 父目录

不客气!

ls -l | grep '^-'

只是寻找名称,管道 cutawk

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


ls -l | grep '^-' | cut -d " " -f 13

你可以这样做:

echo *.* | cut -d ' ' -f 1- --output-delimiter=$'\n'
echo *.* | tr ' ' '\n'
echo *.* | sed 's/\s\+/\n/g'
ls -Ap | sort | grep -v /

此方法不使用外部命令。

bash$ res=$( IFS=$'\n'; AA=(`compgen -d`); IFS='|'; eval compgen -f -X '@("${AA[*]}")' )


bash$ echo "$res"
. . .