我有一个名为 的目录uploads
。它包含一堆文件,以及一些包含文件的子目录。
有没有一种方法可以(一步)执行以下操作:
仅列出根上传目录中的文件 - 我不想看到子文件夹名称或其内容;
和
不要列出任何以以下开头的文件
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 限定符。使用,您可以使用另一种方法使其仅递归一级(不特殊处理点文件)。仅当您在当前目录中运行时,这才完全有效。D
ls uploads/^t_*(.D)
find
find
find
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 /