如何列出一个文件夹下的所有文件但不包括它们的文件夹或子文件。换句话说: 如何只列出文件?
如何列出一个文件夹下的所有文件但不包括它们的文件夹或子文件。换句话说: 如何只列出文件?
使用find
:
find . -maxdepth 1 -type f
使用 -maxdepth 1
选项确保只在当前目录中查找(或者,如果你用某个路径替换 .
,那就是该目录)。如果你想要完整递归地列出该目录及其子目录中的所有文件,只需删除该选项。
find
命令没有-type
和-maxdepth
选项。 - Timofey-type
和-maxdepth
不是普通意义上的选项;BSD find
(在OS X上使用)将它们称为“primaries”,并且它们必须出现在文件名操作数(在本例中为.
;请注意,与Linux不同,BSD版本需要至少一个显式文件名操作数)之后;此答案中的命令在Mac上绝对可行。 - mklement0find *.png -maxdepth 0 -type f
来避免输出文件名中的 ./
前缀;还要注意 -maxdepth
是 0
,不是 1
),只要你需要在 字母顺序 中获取文件名。如果您想要 ls
可以为您完成的其他操作(不同的输出格式/排序,内联控件是否包括隐藏项等),并补充 [多重] 类型过滤,则我的答案中的脚本可以帮助到您。 - mklement0find . -maxdepth 1 -type f
相比,find * -maxdepth 0 -type f
(源自 @AlexHall 的评论)有以下不同之处:
find . ...
命令总是包括隐藏文件,并在输出文件名时加上 ./
前缀。而且,在 GNU find
(Linux)中,通常会输出未排序的列表。
find * ...
命令则由于让 shell 在前面执行 globbing,因此默认情况下排除隐藏项目(可以使用 shopt -s dotglob
更改),仅输出文件名(无前缀),按字母顺序排序。
两种方法都不包括对文件的符号链接;使用 -L
选项即可包括符号链接。 - mklement0ls -p | grep -v
是的:https://dev59.com/2Wkv5IYBdhLWcg3wdQrm#46135507 - Ciro Santilli OurBigBook.comls -p | grep -v /
使用 ls -p 命令可以在文件夹名称后显示 / 斜杠,作为您删除文件夹的标记。
ls
和find
,因为后者返回相对路径而前者仅返回文件名。用正确的工具做好工作。 - Ben Amoscarlpett的基于find
的答案(find . -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的ls
+grep
答案是实用的,但将您锁定为使用长(-l
)输出格式。
fls
(filtering ls)实用程序,
ls
的输出灵活性,同时还提供了类型过滤功能,ls
参数列表之前放置类型过滤字符,例如f
表示文件,d
表示目录,l
表示符号链接(运行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
注意:
您是否需要使用sudo
取决于您如何安装Node.js/io.js以及是否稍后更改了权限; 如果出现EACCES
错误,请尝试使用sudo
再次运行。
-g
确保全局安装,并且需要将fls
放入系统的$PATH
中。
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 ' ' | cut -d ' ' -f 9
查找目录:ls -l /home | grep "^d" | tr -s ' ' | cut -d ' ' -f 9
查找链接:ls -l /home | grep "^l" | tr -s ' ' | cut -d ' ' -f 9
tr -s ' ' 命令将输出转换为以空格分隔的文件,cut 命令指定分隔符为一个空格,并返回第9个字段(始终是文件名/目录名/链接名)。
我经常使用这个命令!
你还可以使用 ls
命令与 grep
或 egrep
命令一起使用,并将其作为别名放入你的配置文件中:
ls -l | egrep -v '^d'
ls -l | grep -v '^d'
ls -l | grep '^-'
cut
或awk
。ls -l | grep '^-' | awk '{print $9}'
ls -l | grep '^-' | cut -d " " -f 13
{ find . -maxdepth 1 -type f | xargs ls -1t | less; }
添加了xargs
使其正常工作,并使用-1
而不是-l
仅显示文件名而不包含其他ls
信息
find -printf0'...' | sort -z
可能有更简洁的方式来实现这一点。 - tripleee此方法不使用外部命令。
bash$ res=$( IFS=$'\n'; AA=(`compgen -d`); IFS='|'; eval compgen -f -X '@("${AA[*]}")' )
bash$ echo "$res"
. . .
你可以选择以下之一:
echo *.* | cut -d ' ' -f 1- --output-delimiter=$'\n'
echo *.* | tr ' ' '\n'
echo *.* | sed 's/\s\+/\n/g'
ls -Ap | sort | grep -v /