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

时间:2012-05-13 20:04:37

标签: bash file-listing

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

11 个答案:

答案 0 :(得分:82)

使用find

find . -maxdepth 1 -type f

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

答案 1 :(得分:5)

ls -p | grep -v /

ls -p允许您显示/后面的文件夹名称,作为您要删除的标记。

答案 2 :(得分:4)

  • carlpett's find-based answerfind . -maxdepth 1 -type f)原则上有效,但与使用ls不完全相同:您可能未排序所有前缀为./ 的文件名列表,您将无法应用ls多个选项 ;
    另外find 总是发现隐藏的,而ls'行为取决于-a-A选项的存在与否。

    • Alex Hall在问题评论中建议的改进 shell globbing find合并

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

为了解决这些限制,我写了fls (filtering ls) utility

  • 提供输出灵活性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注册表安装时: Linux macOS
  • 安装手动:任何类似Unix的平台 Bash

来自npm registry

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

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

[sudo] npm install fls -g

注意

  • 是否需要sudo取决于您安装Node.js / io.js的方式以及您是否changed permissions later;如果您收到EACCES错误,请使用sudo再次尝试。

  • -g确保global installation,并且需要将fls放入您的系统$PATH

手动安装

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

答案 3 :(得分:2)

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

我喜欢使用ls选项作为示例:

  • -l使用长列表格式
  • -t按修改时间排序,最新的优先
  • -r排序时倒序
  • -F--classify将指示符(* / => @ |之一)附加到条目
  • -h,带有{-1和-s的--human-readable,打印尺寸如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替换为.,以列出当前目录,或..列出父目录

答案 4 :(得分:1)

您还可以将lsgrepegrep一起使用,并将其作为别名放入您的个人资料中:

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

答案 5 :(得分:1)

查找文件: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个字段(始终是文件名/目录名/链接名)。

我一直都在用这个!

答案 6 :(得分:0)

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

添加xargs以使其有效,并使用-1代替-l仅显示没有其他ls信息的文件名

答案 7 :(得分:0)

不客气!

ls -l | grep '^-'

只查找名称,通过管道连接到 cutawk

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

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

答案 8 :(得分:-1)

使用正则表达式:

ls -al | egrep -v“^ d。*”

答案 9 :(得分:-2)

再加上carlpett的回答。 对于文件的一个非常有用的视图,您可以将输出传递给ls。

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

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

答案 10 :(得分:-2)

&#34;找到&#39; -maxdepth&#39; &#34;不适用于旧版本的bash,因此我使用:

表示$(ls)中的f;如果[-f $ f];然后回显$ f; fi;完成