如何列出没有目录的文件,并按名称过滤(ls 选项)

Emm*_*myS 48 ls filenames

我有一个名为uploads. 它包含一堆文件,以及一些子目录,这些子目录又包含文件。

有没有一种方法可以(一步)执行以下操作:

  1. 仅列出根上传目录中的文件——我不想看到子文件夹名称或其内容;

  2. 不要列出任何以 t_

我知道-d旗帜,但它并没有让我得到我想要的。

Cal*_*leb 57

这听起来像是find.

  • 使用-maxdepth只返回当前目录,里面的子文件夹不recursivly搜索
  • 使用-type f仅返回文件,而不是目录或设备节点或其他任何
  • 使用组合 if-not-name避免使用您不想要的名称的文件

它可能会像这样组合在一起:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
Run Code Online (Sandbox Code Playgroud)

  • @EmmyS:您可能会发现这里还有一个有用的小技巧。@Gilles 在他的回答中提到使用 `-exec ls -lG -- {} +` 使​​用 ls 的额外选项来获取输出。你也可以只在这个 find 中添加一个 `-ls` 来获得 ls 详细视图的快速粗略近似。 (2认同)

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 开头的文件.)。如果要显示它们,请传递-Als,或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)

  • 你有日常工作吗?;-) 我一直对你的答案的长度和详细程度感到惊讶,即使是在 Unix SE 上看起来最简单的问题!...无论如何都要坚持下去!:) (3认同)
  • Gnu `ls` 没有`--use-telepathy` 选项吗?这是仅显示所需文件的最快方式。虽然它可能不便携。 (2认同)

小智 10

ls -l /folder | grep ^- | awk '{print $9}'
Run Code Online (Sandbox Code Playgroud)

  • @EmmyS 表示输出的第 9 个字段/列。这个答案试图[解析`ls`输出](http://mywiki.wooledge.org/ParsingLs)。 (3认同)