我觉得我错过了一些非常简单的东西,我想知道是否可以播种最后 4 个修改文件的最后几行。我尝试过这样的事情
tail | ls -lt | head -5
但我认为我应该迭代ls | -lt
结果并将 tail 应用于它,但我不知道该怎么做。任何帮助表示赞赏
答案1
在开始之前,通常认为将 的输出用作ls
其他内容的输入是不好的做法;一个常见的缺陷是,对于名称中包含空格/换行符的文件,它可能无法按预期工作。
考虑到这一限制,您可能会发现ls | something
大多数情况下都可以正常工作。
您的命令正朝着正确的方向前进,这是一种解决方案,其中包含上述ls
限制:
ls -t | head -5 | xargs tail
如果列表中存在子目录,这将引发非致命错误。
答案2
在zsh
shell 中,可以通过 globbing 模式获取当前目录中最近修改的四个常规文件
./*(.Dom[1,4])
... 其中./*
匹配当前目录中的所有名称,括号修改匹配的行为。比赛顺利.
进行*
仅有的常规文件,同时D
使其也匹配隐藏名称(与shelldotglob
中启用的 shell 选项一样bash
)。om
按修改时间戳对结果名称列表进行排序,并挑选出[1,4]
前四个名称。
要调用tail
这些文件:
tail ./*(.Dom[1,4])
从bash
外壳:
zsh -c 'tail ./*(.Dom[1,4])'
如果您想考虑当前目录或其下任何位置的所有文件,请使用
zsh -c 'tail ./**/*(.Dom[1,4])'
当启用 shell 选项时,该**
模式的工作方式与相同的通配模式类似,即它递归地向下匹配到子目录。 in glob 限定符将使匹配到具有隐藏名称的子目录。bash
globstar
D
**
答案3
也许这会对你有帮助
find . -type f -mmin -5 -ls | tail -4
代替.
=> 添加您的目标目录路径
上面的命令将为您提供 5 分钟前最后修改的文件,如果需要,您可以将最后修改的分钟数从 5 分钟增加到您需要的值eg: 15min , 20min , 60min
答案4
如果没有子目录,那么即使文件名称中有空格,这也应该有效。但是,如果文件名称中包含换行符,则会失败。
ls -1t | head -4 | tr '\n' '\0' | xargs -0 head -10
不幸的是,如果有子目录,它就会失败。如果有,那么这应该有效
find . -type f -maxdepth 1 -print0 | xargs -0 ls -1t | head -4 | tr '\n' '\0' | xargs -0 head -10