如何按字母顺序对目录列表进行排序并获取在特定字符串之后排序的第一个值?

如何按字母顺序对目录列表进行排序并获取在特定字符串之后排序的第一个值?

我有一个充满备份文件夹的目录,名称格式为 yyyy-MM-dd--HH:mm:ss

如果我以相同的格式输入日期,是否有办法获取在其之后排序的第一个目录,并将该文件夹复制到其他位置?

例如,如果我的备份列表如下所示:

2019-12-04--16:12:56
2019-12-09--13:36:53
2020-01-23--13:24:13
2020-01-23--13:47:03

我输入2020-01-05--00:00:00,我想恢复2020-01-23--13:24:13

答案1

for dir in ????-??-??--??:??:??/; do
    if [[ $dir > "2020-01-05--00:00:00" ]]; then
        printf '%s\n' "$dir"

        # process "$dir" here

        break
    fi
done

上面的脚本将循环遍历当前目录中名称与模式匹配的目录????-??-??--??:??:??

对于每个目录,它都会与字符串进行比较2020-01-05--00:00:00。如果它按字典顺序排序在该字符串之后,则打印目录名称并退出循环。

这是有效的,因为路径名扩展产生的列表是根据当前整理顺序排序的(就像ls默认情况下对列表进行排序一样)。

要将该目录复制到其他地方,请将注释替换为类似的内容

rsync -av "$dir" /somewhere/elsewhere

以下是一个脚本,它从第一个命令行参数中获取特定字符串并执行相同的操作:

#!/bin/bash

for dir in ????-??-??--??:??:??/; do
    if [[ $dir > "$1" ]]; then
        printf '%s\n' "$dir"

        # process "$dir" here

        break
    fi
done

使用您列出的目录对此进行测试:

$ ls -l
total 10
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2019-12-04--16:12:56
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2019-12-09--13:36:53
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2020-01-23--13:24:13
drwxr-xr-x  2 myself  wheel  512 Jan 24 11:14 2020-01-23--13:47:03
-rw-r--r--  1 myself  wheel  119 Jan 24 11:23 script.sh
$ ./script.sh "2020-01-05--00:00:00"
2020-01-23--13:24:13/

答案2

我想出了

$ printf '%s\n' ????-??-??--??:??:?? | awk '$1 > "2020-01-05--00:00:00"{print;exit}'
2020-01-23--13:24:13

答案3

zsh

ref=2020-01-05--00:00:00
list=($ref *(DN/oN)) # list is ref + all directories unsorted
list=(${(o)list}) # sort the list (as per locale collation algorithm)
print -r -- ${list[$list[(ie)$ref] + 1]-none}

(其中扩展为xactly元素的$array[(ie)string]数组索引)。iestring

答案4

你可以尝试

~$ ls -r | head -n 1

相关内容