我有一个充满备份文件夹的目录,名称格式为 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]
数组索引)。i
e
string
答案4
你可以尝试
~$ ls -r | head -n 1