列出最新修改的子目录

列出最新修改的子目录

所以我试图获取最后修改的子目录。

IE。 1727 有 8 个备份,但我希望我编写的脚本仅 grep 最新备份目录的内容。每个运行的备份都会在相应的父目录下获得一个新的子目录。

[root@localhost backups]# find . -mindepth 2 -maxdepth 2 -not -empty -type d | grep -v logs
./1014/backup_1083219
./1014/backup_1082586
./1014/backup_1081955
./1014/backup_1081334
./1014/backup_1089443
./1014/backup_1080711
./1014/backup_1090690
./1014/backup_1091313
./1014/backup_1090062
./350/backup_1043735
./350/backup_1087678
./350/backup_1088301
./350/backup_1090170
./350/backup_222862
./350/backup_1059530
./350/backup_1088925
./350/backup_1091416
./350/backup_1089549
./350/backup_1090793
./1854/backup_1091300
./460/backup_1089536
./460/backup_1090781
./460/backup_1090159
./460/backup_1086423
./460/backup_1087045

我知道我可以附加一个 | ls -td -- */ 但这仍然无法帮助我提供仅包含最新子目录的目录列表

理想情况下,我想要类似以下内容作为输出(假设子文件夹都是最新修改的)

./1727/backup_1059492
./1113/backup_862734
./881/backup_1088974
./1014/backup_1089443
./350/backup_1059530
./1854/backup_1091300
./460/backup_1086423

我想得越多,我想我可能需要一个 while 循环来处理所有目录和子目录,但我不确定。

答案1

在 中zsh,你可以这样做:

for d (<->(NF)) print -rC1 -- $d/backup_<->(N/om[1])

对于backup_xxx每个yyy目录的最新的 1 子目录。

或者:

for d (<->(NF)) print -rC1 -- $d/backup_<->(N/n[-1])

对于数字最高的那个。

  • <->匹配任何 ASCII 十进制数字序列。
  • (NF)(N/n[-1])... 指定全局限定符
  • /选择文件类型目录
  • F选择F所有目录(类似/但不包括空目录)。
  • nnumericglobsort当文件名包含十进制数字序列时,为该 glob 打开数字排序。
  • om om修改时间排序(从最新到最旧,例如ls -t)。
  • [1]选择第一个,[-1]最后一个。
  • print -rC1 -- printr列上有1 C

另一种方法可能是按每行从最新到最旧的顺序列出这些文件,并用于awk选择每个顶级目录的第一个。只要我们将文件列表限制为具有此类驯服名称的文件,就可以了:

print -rC1 -- <->/backup_<->(N/om) | awk -F/ '!seen[$1]++'

(或者nOn代替子目录中om最高的子目录)。<number>backup_<number>

与以前的解决方案的区别在于,它将遵循当前目录中的符号链接,就好像您在以前的方法中使用了<->(N-F)而不是一样。<->(NF)

使用 GNU find,还可以通过以下方式完成:

LC_ALL=C find . -mindepth 2 -maxdepth 2 -regextype posix-extended \
  -regex './[0-9]+/backup_[0-9]+' -type d -printf '%T@/%P\n' |
  sort -rn |
  awk -F/ '!seen[$2]++ {print $2"/"$3"}'

或者对于子目录<number>中的最高子目录backup_<number>

LC_ALL=C find . -mindepth 2 -maxdepth 2 -regextype posix-extended \
  -regex './[0-9]+/backup_[0-9]+' -type d -printf '%P\n' |
  sort -t_ -k2rn |
  awk -F/ '!seen[$2]++'

要将这些目录作为一个列表,以便您可以将其传递给一个grep调用,例如:

(){ dirs=( $^@/backup_<->(N/om[1]) ) } <->(NF)
(( $#dirs )) && grep -re pattern -- $dirs

或者,由于这里的目录名称非常温和,并且不包含任何特殊的字符xargs,请选择上面的任何解决方案并通过管道传输到xargs -r grep -re pattern ---r作为 GNU 扩展, forxargsgrepthough 都具有不相关的含义)。

对于未受约束的目录名称,您可以使用 NUL 分隔的记录(将选项添加到-Nprint)并将选项添加到。-v ORS='\0'gawk-0xargs


¹ 请记住,目录的修改时间会在目录中添加/删除/重命名条目时更新,而不是在修改其中任何文件的数据时更新,因此它可能不是您真正想要的。

相关内容