我有一个名为uploads
. 它包含一堆文件,以及一些子目录,这些子目录又包含文件。
有没有一种方法可以(一步)执行以下操作:
仅列出根上传目录中的文件——我不想看到子文件夹名称或其内容;
和
不要列出任何以 t_
我知道-d
旗帜,但它并没有让我得到我想要的。
Cal*_*leb 57
这听起来像是find
.
-maxdepth
只返回当前目录,里面的子文件夹不recursivly搜索-type f
仅返回文件,而不是目录或设备节点或其他任何-not
和-name
避免使用您不想要的名称的文件它可能会像这样组合在一起:
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 19
GNU ls(即非嵌入式 Linux 系统和 Cygwin 上的 ls 命令,也可用于其他一些 unices)有一个选项可以根据文件的名称隐藏一些文件。但是没有办法忽略目录。
ls --hide='t_*' uploads
Run Code Online (Sandbox Code Playgroud)
另一种方法是让您的外壳进行匹配。Bash、ksh 和 zsh 有一个否定模式!(t_*)
来匹配除匹配之外的所有文件t*
;在 bash 中,此功能需要用 开启shopt -s extglob
,而在 zsh 中,需要用setopt ksh_glob
. Zsh 也有等效的语法^t_*
,需要使用setopt extended_glob
. 这仍然不会忽略目录。Zsh 有一个额外的功能,不仅可以按名称匹配文件,还可以按元数据等匹配文件:glob qualifiers。添加(.)
在匹配的末尾以限制为常规文件。否定^
是名称匹配语法的一部分,因此^t_*(.)
表示“所有常规文件不匹配t_*
”而不是“所有不匹配的常规文件的文件t_*
”。
setopt extended_glob # put this in your ~/.zshrc
ls uploads/^t_*(.)
Run Code Online (Sandbox Code Playgroud)
如果您发现自己没有高级工具,您可以在任何带有find
. 这不是您通常在命令行上输入的那种东西,但它功能强大且精确。Caleb 已经展示了如何使用 GNU find 做到这一点。该-maxdepth
选项不可移植;您可以-prune
改为使用,以可移植地停止find
递归。
find uploads/* -type d -prune -o \! -type f -name 't_*' -print
Run Code Online (Sandbox Code Playgroud)
更换-print
的-exec ls -lG -- {} +
执行ls
与文件的首选项。
以上所有命令都隐藏点文件(即名称以 a 开头的文件.
)。如果要显示它们,请传递-A
给ls
,或D
在 zsh ( ls uploads/^t_*(.D)
) 中添加glob 限定符。使用find
,您可以使用不同的方法使其仅递归一级(find
不特别处理点文件)。这仅在您find
在当前目录中运行时才完全有效。
cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print
Run Code Online (Sandbox Code Playgroud)
小智 10
ls -l /folder | grep ^- | awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)