所以我试图获取最后修改的子目录。
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
所有目录(类似/
但不包括空目录)。n
numericglobsort
当文件名包含十进制数字序列时,为该 glob 打开数字排序。om
o
按m
修改时间排序(从最新到最旧,例如ls -t
)。[1]
选择第一个,[-1]
最后一个。print -rC1 --
print
r
列上有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 扩展, forxargs
和grep
though 都具有不相关的含义)。
对于未受约束的目录名称,您可以使用 NUL 分隔的记录(将选项添加到-N
或print
)并将选项添加到。-v ORS='\0'
gawk
-0
xargs
¹ 请记住,目录的修改时间会在目录中添加/删除/重命名条目时更新,而不是在修改其中任何文件的数据时更新,因此它可能不是您真正想要的。