【问题标题】:How to get the nth recent file in the nth last modified subdirectory using pipes如何使用管道在最后修改的第 n 个子目录中获取第 n 个最近的文件
【发布时间】:2023-03-17 11:14:01
【问题描述】:

我正在为操作系统考试做练习。它需要获取当前目录中第二个最后修改的子目录的第三个最近文件。然后我必须以相反的顺序打印它的行。我不能使用 tac 命令。文中建议使用(awk 和 sed 除外):head、tails、wc。

我已成功获取所请求文件的文件名(但我认为方式过于复杂)。现在我必须反向打印它。我想我可以使用这个 awk 解决方案https://stackoverflow.com/a/744093/11614625

这就是我获取文件名的方式:

ls -t | head | awk '{system("test -d \"" $0 "\" && echo \"" $0 "\"")}' | awk 'NR==2 {system("ls \"" $0 "\" | head")}' | awk 'NR==1'

我怎样才能做得更好?如果第三个目录或第二个文件不存在怎么办?

【问题讨论】:

  • 另外,在 awk 中使用 system() 是一种 shell 脚本反模式。找出类似 .... | awk 'NR==2' | while read dir ; do if [ -d $dir ] ; then echo found dir=$dir"; fi ; done | .... 的东西。祝你好运。
  • 它可以在 sed 中更简洁地完成,使用保持空间。提示足够了吗?

标签: shell awk sed


【解决方案1】:

请参阅 https://mywiki.wooledge.org/ParsingLsawk '{system("test -d \"" $0 "\" && echo \"" $0 "\"")}' 正在调用 shell 以调用 awk 以调用系统以调用 shell 以调用测试,如果您打算这样做,这显然是一种比首先进行 shell 调用测试更糟糕的方法。此外,任何将整个文件读入内存的解决方案(就像任何 sed 或天真的 awk 解决方案一样)对于大文件都会失败,因为它们会超出可用内存。

不幸的是,这是如何稳健地做你想做的事:

dir="$(find . -mindepth 1 -maxdepth 1 -type d -printf '%T+\t%p\0' |
       sort -rz |
       awk -v RS='\0' 'NR==2{sub(/[^\t]+\t/,""); print; exit}')" &&
file="$(find "$dir" -mindepth 1 -maxdepth 1 -type f -printf '%T+\t%p\0' |
       sort -z |
       awk -v RS='\0' 'NR==3{sub(/[^\t]+\t/,""); print; exit}')" &&
cat -n "$file" | sort -rn | cut -f2-

如果任何管道中的任何命令失败,则将打印来自失败命令的错误消息,然后不会执行其他命令,整体退出状态将是该失败命令的失败状态。

我使用cat | sort | cut 而不是awksed 反向打印文件,因为awk(除非您在其中写入需求分页)或sed 必须将整个文件读入内存一次等对于非常大的文件会失败,而 sort 旨在通过根据需要使用带有 tmp 文件的分页来处理大文件,并且一次只将部分文件保留在内存中,因此它仅受您拥有多少可用磁盘空间的限制你的设备。

以上需要 GNU 工具来提供/处理 NUL 行尾 - 如果您没有这些工具,则在 find 命令中将 \0 更改为 \n,从排序选项中删除 z,然后从 awk 命令中删除 -v RS='\0' 并注意结果仅在您的目录或文件名不包含换行符时才有效。

【讨论】:

  • 我想知道你是怎么把那只兔子从帽子里拉出来的。为什么不能只在末尾添加tac 文件而不是cat -n .. | sort -rn | cut -f2-
  • @DavidC.Rankin 因为 OP 在她的问题中说I can not use tac command
  • 呵呵……答案就是……在上面涂上光泽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多