ディレクトリリストをアルファベット順にソートし、特定の文字列の後に最初の値をソートする方法は?

ディレクトリリストをアルファベット順にソートし、特定の文字列の後に最初の値をソートする方法は?

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}

$array[(ie)string]xactly要素の配列インデックスに拡張)iestring

答え4

あなたは試すことができます

~$ ls -r | head -n 1

関連情報