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

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

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

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

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

  2. 不要列出任何以以下开头的文件t_

我了解-d国旗,但它并没有让我得到我想要的东西。

答案1

这听起来像是一份工作find

  • 用于-maxdepth仅返回当前目录,而不是在子文件夹内递归搜索
  • 用于-type f仅返回文件而不返回目录或设备节点或其他任何内容
  • -not使用 if和的组合-name以避免使用您不想要的名称的文件

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

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'

答案2

GNU ls(即非嵌入式 Linux 系统和 Cygwin 上的 ls 命令,也可在其他一些 unice 上使用)有一个选项可以根据文件名隐藏某些文件。但没有办法忽略目录。

ls --hide='t_*' uploads

另一种方法是让您的 shell 进行匹配。 Bash、ksh 和 zsh 有一个否定模式!(t_*)来匹配除了匹配的文件之外的所有文件t*;在 bash 中,需要使用 来打开此功能shopt -s extglob,而在 zsh 中,需要使用 来打开此功能setopt ksh_glob。 Zsh 也具有等效语法^t_*,需要使用setopt extended_glob.这仍然不会忽略目录。 Zsh 有一个额外的功能,不仅可以按名称匹配文件,还可以按元数据等进行匹配:全局限定符。添加(.)在匹配末尾以限制为常规文件。否定^是名称匹配语法的一部分,因此^t_*(.)意味着“所有不匹配的常规文件t_*”,而不是“所有不匹配常规文件的文件t_*”。

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

如果您发现自己没有高级工具,您可以在任何带有find.这不是您通常在命令行上键入的内容,但它功能强大且精确。Caleb 已经展示了如何使用 GNU find 来做到这一点。该-maxdepth选项不可移植;您可以使用-prune它来便携式地停止find递归。

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

替换-print为以在文件上-exec ls -lG -- {} +执行您最喜欢的选项。ls

上面的所有命令都隐藏点文件(即名称以 开头的文件.)。如果要显示它们,请传递-A给,或在 zsh ( )中ls添加glob 限定符。使用,您可以使用另一种方法使其仅递归一级(不特殊处理点文件)。仅当您在当前目录中运行时,这才完全有效。Dls uploads/^t_*(.D)findfindfind

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print

答案3

ls -l /folder | grep ^- | awk '{print $9}'

答案4

我发现了这些简短的方法:

ls -p uploads | grep -Ev '/'

或者

ls -pIt_* uploads | grep -v /

相关内容