it-swarm.cn

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

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

有什么办法可以(一步)执行以下操作:

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

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

我知道-d标志,但是并不能完全满足我的需求。

45
EmmyS

这听起来像是find的工作。

  • 使用-maxdepth仅返回当前目录,而不在子文件夹中递归搜索
  • 使用-type f仅返回文件,而不返回目录或设备节点或其他任何文件
  • 如果-not-name一起使用,请避免使用不需要名称的文件

它可能像这样合并在一起:

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

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

ls --hide='t_*' uploads

另一种方法是使您的Shell进行匹配。 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_*(.)

如果您发现自己没有高级工具,则​​可以使用find在任何UNIX上执行此操作。这不是您通常在命令行上键入的内容,但功能强大且精确。 Caleb已经展示了如何使用GNU find-maxdepth选项不可移植;您可以使用-Prune来便携地停止find从递归。

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

-print替换-exec ls -lG -- {} +以对文件执行您喜欢的选项ls

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

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
18
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$
1
RICARDO MARMOLEJO GARCIA

如果担心find的-maxdepth可移植性问题,则可以使用:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

我不是专家,但我认为这应该可行。我想它看起来有些神秘,但是如果您说awk,实际上不是。可以使用$ NF代替$ 9。您也可以这样做:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

哪个做同样的事情(但效率可能不如前一个???)。

实际上,在考虑了其他帖子之后,

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

是更短更清晰的方法。

如果我错了,请有人纠正我。 :-)

0
kkaszub

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

ls -p uploads | grep -Ev '/'

要么

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

让我用ls和管道试一下:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

说最后一列是第9列。

0
Y0NG