web-dev-qa-db-ja.com

ディレクトリのリストをアルファベット順に並べ替えて、特定の文字列の後に並べ替える最初の値を取得するにはどうすればよいですか?

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

4
Tharwen
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/
6
Kusalananda

思いついた

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

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}
_

(ここで、$array[(ie)string]は、ixactly eである要素の配列stringndexに展開されます)。

2

ls|sort|grep -A 1 2020-01-20|head -n 2|tail -n 1

0
stoney