如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:如何仅列出文件?
如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:如何仅列出文件?
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'行为则取决于-aor-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不正确的便携式选择。