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

Tha*_*wen 4 backup directory sort timestamps

我有一个充满备份文件夹的目录,名称格式为 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
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 6

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

        # process "$dir" here

        break
    fi
done
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

rsync -av "$dir" /somewhere/elsewhere
Run Code Online (Sandbox Code Playgroud)

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

rsync -av "$dir" /somewhere/elsewhere
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

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

        # process "$dir" here

        break
    fi
done
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)


ste*_*eve 5

我想出了

$ printf '%s\n' ????-??-??--??:??:?? | awk '$1 > "2020-01-05--00:00:00"{print;exit}'
2020-01-23--13:24:13
Run Code Online (Sandbox Code Playgroud)