【问题标题】:Tail multiple directories尾随多个目录
【发布时间】:2017-12-12 20:32:26
【问题描述】:

如何只打印嵌套目录中匹配特定模式的最后 (n) 个文件?

在做

ls -l dir*/history/ | tail 

只给出最后一个目录的内容。

我怀疑它与xargs 有关,但我不知道如何。

【问题讨论】:

  • 您要打印每个子目录的 10 个文件,还是全部打印?
  • 这将有助于了解您需要找到哪种类型的“某些模式” 以了解是 globbing 还是 regex 匹配 i> 是必需的。
  • 我想我终于明白你的需要了。试试这个例子。

标签: bash directory ls tail xargs


【解决方案1】:

要直接回答您的问题,请使用循环:

for d in dir*/history/; do
    ls -l "$d" | tail
done

但是,对于比这更高级的目录“过滤”(和处理),find 可能会派上用场。

【讨论】:

  • 全部放在一行中,例如for d in dir*; do ls -l "$d" | tail; done
【解决方案2】:

试试看:

find . -type d -name "dir*" | while read dir; do find "$dir" | tail -n 5; done

不是很简洁,但是如果您需要匹配所有级别的嵌套目录并从每个子目录中选择 N 个文件...
还要在每个管道之前添加 2>/dev/null 以抑制“权限被拒绝”消息。或者使用 sudo。
如果您需要在 while 循环中更改全局变量,则与进程替换等效:

while read dir; do find "$dir" | tail -n 5; done < <(find . -type d -name "dir*")

【讨论】:

  • 添加-name "pattern" 有助于答案更好地匹配更新后的问题。您还需要添加 sort,因为 find 不保留规范排序顺序。
  • 我编辑了帖子以添加我的 dir 模式是嵌套的。您的示例并没有真正起作用(不确定是否适用)。
  • 你说得对,已编辑。不过,有人设法投了我的票:)
  • 它只打印最后 10 个文件,而不是每个目录。如果在find 中使用-name 过滤器,则不需要grep
  • 好吧,他没有说每个目录。 -name 是错误的,因为它匹配文件名,而不是路径上的目录。 -path 也是错误的,因为它匹配路径上的文件名和目录名。
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2011-02-20
  • 2017-12-22
  • 2019-01-10
  • 2020-03-16
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多