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


84

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




所提议的重复项似乎都没有实现省略目录的要求。
3:30

Answers:


112

使用find

find . -maxdepth 1 -type f

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


在对mklement0的答案发表评论之后,我意识到“查找./*.png -maxdepth 1 -type f> pngs.txt”可能会达到相同的效果。是的 无需安装脚本。
亚历克斯·霍尔

2
find在Mac上,既没有-type,也没有-maxdepth选项。
Timofey

1
@Tim:-type并且-maxdepth不是正常意义上的选项;BSD find(在OS X上使用)将它们称为primaries,它们必须位于文件名操作数之后.在这种情况下,请注意;与Linux不同,BSD版本需要至少一个显式的文件名操作数);此答案中的命令绝对适用于Mac。
mklement0 '16

1
@AlexHall:这是一个聪明的解决方案(虽然我建议find *.png -maxdepth 0 -type f,以避免./在输出文件名前缀;还要注意-maxdepth0,不是1),只要你需要的是文件字母顺序排列。如果您想要ls其他可以为您做的事情(不同的输出格式/顺序,对是否包含隐藏项目的内联控制),并辅以[多]类型过滤,则我回答中的脚本可以提供帮助。
mklement0 '16

1
与答案形成对比find * -maxdepth 0 -type f(从@AlexHall的评论中得出的另一种选择)与find . -maxdepth 1 -type f答案:find . ...总是包含隐藏项,总是在输出文件名前加上./,并且对于GNU find(Linux),通常会输出未排序的列表。find * ...,由于可以让Shell预先进行预览,因此默认情况下不包括隐藏项(可以使用进行更改shopt -s dotglob),仅输出文件名(无前缀),并按字母顺序排序。两种方法都没有包含文件的符号链接。使用选项-L来这样做。
mklement0 '16

14
ls -p | grep -v /

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


很高兴看到ls除以外的示例find,因为后者返回相对路径,而前者仅返回文件名。使用正确的工具完成工作。
Ben Amos

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

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

          find * -maxdepth 0 -type f  # find -L * ... includes symlinks to files
      
      • 但是,尽管这解决了前缀问题并为您提供了按字母顺序排序的输出,但您仍然无法(内联)控制隐藏项的包含,也无法访问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)

安装

支持平台

  • 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)。

1
辉煌。即使涉及创建另一个脚本。我从链接到的纯文本源中复制并粘贴到一个文本文件中,并使用以下命令在Cygwin中运行它:fls.sh f * .png> pngs.txt和Bingo:无路径的.png文件列表。但是,实际上,ls是否具有与DOS的“ dir / b”开关不相上下的选项?我浏览了ls的--help输出的内容,至少没有任何内容。
Alex Hall

1
@AlexHall:谢谢;tl; dr:尝试-1(第一名);ls实际上默认为“裸”输出,即仅文件名,但是在输出到终端时使用基于列的布局(每行多个文件名)。要在每个输出行上获取一个文件名(dir /b如果有内存,则使用该文件名),请使用该-1选项,当stdout连接到终端时(例如,在发送到管道或输出文件时),该选项实际上是隐式打开的。
mklement0 15/09/26

2

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

我喜欢使用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通过.以列表当前目录..父目录


1

您还可以使用lsgrepegrep并把它放在自己的个人资料别名:

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

出于上述原因,我不会将其放在脚本中,而是另一个快捷方法:ls -F | grep -v'/ $'
mooie

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''将输出转换为以空格分隔的文件,剪切命令说分隔符为空格,并返回第9个字段(始终是文件名/目录名/链接名)。

我经常用这个!


哇!如果文件名包含空格怎么办?
F. Hauri

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

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


这具有一定的优点,因为它可以按时间执行排序,尽管可以用一些笨拙的方法来做到这一点find -printf0 '...' | sort -z
Tripleee '18

-2

只是添加卡尔珀特的答案。有关文件的有用视图,可以将输出传递给ls。

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

以列表格式显示最近修改的文件,当您下载了很多文件并且想要查看最近文件的整洁版本时,此功能非常有用。


3
这可能不符合您的预期!ls不读取标准输入,因此将任何内容通过管道传递给都没有用ls。你想念xargs吗?
gniourf_gniourf 2015年

换句话说:find这个答案中的命令被完全忽略了;总体命令与相同ls -lt | less,不执行任何类型过滤。
mklement0 '16

1
尽管使用GNUfind可以做到find . -maxdepth 1 -type f -ls。这也似乎在Mac OS工作,虽然我相信-maxdepth-ls不正确的便携式选择。
tripleee

-2

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

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


使用for f in $(ls)双重错误。您可以使用来解决此问题,for f in *但由于您没有echo正确引用该参数,因此它会中断。
3:30
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.