如何列出一个文件夹的所有文件,但不列出其文件夹或子文件。换句话说:我怎样才能只列出文件?
11 回答
使用find
:
find . -maxdepth 1 -type f
使用该-maxdepth 1
选项可确保您仅查看当前目录(或者,如果您将 替换为.
某个路径,则该目录)。如果您想要该目录和子目录中所有文件的完整递归列表,只需删除该选项即可。
ls -p | grep -v /
ls -p 让您在文件夹名称之后显示 /,它充当您删除的标签。
carlpett 的
find
基于答案(find . -maxdepth 1 -type f
) 原则上有效,但与使用不完全相同ls
:您会得到一个可能未排序的文件名列表,所有前缀都是./
,并且您失去了应用ls
许多选项的能力;
也find
总是会找到隐藏的项目,而ls
' 的行为取决于-a
or-A
选项的存在与否。Alex Hall在对该问题的评论中建议的一项改进是将shell globbing与:
find
find * -maxdepth 0 -type f # find -L * ... includes symlinks to files
- 然而,虽然这解决了前缀问题并为您提供按字母顺序排序的输出,但您仍然无法(内联)控制隐藏项的包含,也无法访问
ls
的许多其他排序/输出格式选项。
- 然而,虽然这解决了前缀问题并为您提供按字母顺序排序的输出,但您仍然无法(内联)控制隐藏项的包含,也无法访问
Hans Roggeman 的
ls
+grep
答案是务实的,但会锁定您使用 long (-l
) 输出格式。
为了解决这些限制,我编写了fls
( filtering 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)
安装
支持的平台
- 从npm 注册表安装时:Linux和macOS
- 手动安装时:任何带有Bash的类 Unix平台
从npm 注册表
注意:即使你不使用 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)。
列出某个目录的内容,不包括子目录
我喜欢使用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 /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 个字段(始终是文件名/目录名/链接名)。
我经常用这个!
您还可以使用ls
with grep
oregrep
并将其作为别名放入您的个人资料中:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
添加xargs
以使其正常工作,并用于-1
代替-l
仅显示文件名而没有其他ls
信息
不客气!
ls -l | grep '^-'
只是寻找名称,管道到cut
or awk
。
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 /
只是添加到carlpett的答案。要获得非常有用的文件视图,您可以将输出通过管道传输到 ls。
find . -maxdepth 1 -type f|ls -lt|less
以列表格式显示最近修改的文件,当您下载了大量文件并希望查看最近文件的整洁版本时非常有用。
“find '-maxdepth'” 不适用于我的旧版本 bash,因此我使用:
对于 $(ls) 中的 f ;如果 [ -f $f ] ; 然后回显 $f ; 菲; 完毕