如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:如何仅列出文件?
如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:如何仅列出文件?
Answers:
使用find
:
find . -maxdepth 1 -type f
使用该-maxdepth 1
选项可确保您仅查看当前目录(或者,如果将其替换为.
某个路径,则该目录)。如果您想要该目录和子目录中所有文件的完整递归列表,只需删除该选项即可。
find
在Mac上,既没有-type
,也没有-maxdepth
选项。
-type
并且-maxdepth
不是正常意义上的选项;BSD find
(在OS X上使用)将它们称为primaries,它们必须位于文件名操作数之后(.
在这种情况下,请注意;与Linux不同,BSD版本需要至少一个显式的文件名操作数);此答案中的命令绝对适用于Mac。
find *.png -maxdepth 0 -type f
,以避免./
在输出文件名前缀;还要注意-maxdepth
的0
,不是1
),只要你需要的是文件名的字母顺序排列。如果您想要ls
其他可以为您做的事情(不同的输出格式/顺序,对是否包含隐藏项目的内联控制),并辅以[多]类型过滤,则我回答中的脚本可以提供帮助。
find * -maxdepth 0 -type f
(从@AlexHall的评论中得出的另一种选择)与find . -maxdepth 1 -type f
答案:find . ...
总是包含隐藏项,总是在输出文件名前加上./
,并且对于GNU find
(Linux),通常会输出未排序的列表。find * ...
,由于可以让Shell预先进行预览,因此默认情况下不包括隐藏项(可以使用进行更改shopt -s dotglob
),仅输出文件名(无前缀),并按字母顺序排序。两种方法都没有包含文件的符号链接。使用选项-L
来这样做。
find
基于carlpett的答案(find . -maxdepth 1 -type f
)在原理上有效,但与使用完全不同ls
:您将得到一个可能未排序的文件名列表,都带有前缀./
,并且失去了应用ls
多个选项的能力;
也find
总是查找隐藏的项目,而ls
'行为则取决于-a
or-A
选项的存在与否。
亚历克斯·霍尔(Alex Hall)在对该问题的评论中提出了一项改进,那就是将Shell Globing与:find
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 --help
或fls --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)
支持平台
注意:即使您不使用Node.js,它的程序包管理器npm
仍然可以跨平台使用,并且易于安装;尝试
curl -L https://git.io/n-install | bash
随着Node.js的安装,安装如下:
[sudo] npm install fls -g
注意事项:
bash
脚本下载为fls
。chmod +x fls
。$PATH
,例如/usr/local/bin
(macOS)或/usr/bin
(Linux)。-1
(第一名);ls
实际上默认为“裸”输出,即仅文件名,但是在输出到终端时使用基于列的布局(每行多个文件名)。要在每个输出行上获取一个文件名(dir /b
如果有内存,则使用该文件名),请使用该-1
选项,当stdout未连接到终端时(例如,在发送到管道或输出文件时),该选项实际上是隐式打开的。
我喜欢使用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
通过.
以列表当前目录或..
为父目录。
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
添加xargs
以使其起作用,并且用于-1
代替-l
仅显示文件名而没有其他ls
信息
find -printf0 '...' | sort -z
只是添加卡尔珀特的答案。有关文件的有用视图,可以将输出传递给ls。
find . -maxdepth 1 -type f|ls -lt|less
以列表格式显示最近修改的文件,当您下载了很多文件并且想要查看最近文件的整洁版本时,此功能非常有用。
ls
不读取标准输入,因此将任何内容通过管道传递给都没有用ls
。你想念xargs
吗?
find
这个答案中的命令被完全忽略了;总体命令与相同ls -lt | less
,不执行任何类型过滤。
find
可以做到find . -maxdepth 1 -type f -ls
。这也似乎在Mac OS工作,虽然我相信-maxdepth
和-ls
不正确的便携式选择。