私の知識の欠如について謝罪から始めたいです。これは実際に私の最初のbashスクリプトであり、私のLinuxの知識はデフォルトでは存在しません。説明的な答えをいただきありがとうございます。方法ではない理由を理解したいです。
1日に数回実行する必要がある退屈なプロセスを自動化するスクリプトを作成しようとしています。つまり、このスクリプトは特定の要件に従ってファイルセットを準備する必要があります。スクリプトはテンプレートファイルを移動し、バージョン番号を割り当てるか、特定のディレクトリで見つかったものに基づいて新しいバージョン番号に既存のファイルをコピーする必要があります(空の場合は作成、内容がある場合はコピーなど)。 )。
たとえば、ファイル名は次のようになります。
YYYYMMDD_##_username_testfile.json
ここで、##(バージョン番号)は、最初の作成の場合は01、コピーの場合は02、後続のコピーの場合は03などでなければなりません。単一のディレクトリには、日付と順次バージョン番号が異なる最大10個以上のファイルと同じ形式を使用しますが、testfile.json以外のファイルで終わる追加ファイルを含めることができます。
スクリプトがtestfile.jsonで終わり、バージョン番号が最も高い「test」ディレクトリでファイルを検索する方法が見つからないようです。見つかったら、バージョン番号を変数/引数として抽出します。 cp シーケンスに戻すことができます。
この時点で、私はどのコマンドを使うべきかさえわかりません。インターネットは、grepからawk、リスト、並べ替えまで、すべてを提供しています。頭が回っています!
どんな助けでも大変感謝します。すべての識別情報を削除しました。追加情報が必要な場合はお知らせください。
答え1
段階的に分けてみましょう。
次の数値を返す関数を作成します。目標は単純さであり、最大効率ではありません。
ディレクトリ名を指定する必要があります。
testfile.json
ファイル名の一部を指定する必要があります。
このディレクトリでそれで終わるすべてのファイルを見つける必要があります。
$ 1、$ 2などを使用してパラメータを関数に渡します。
getnum(){
ls "$1" | grep "$2\$"
}
2番目のフィールドのみを削除して_
区切り文字として使用するには、cutを使用します。 (これを行うには、grepとcutの代わりにsedを使用し、他の人はawkを使用することもできますが、ここでは簡単に保ちます。)
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2
}
数値順に並べ替えるには、sortを使用してください。
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}
最初の値のみを取得するには、headを使用してください。
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
}
要約すると、この方法でローカル変数の値を取得できます。
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}
値がない場合、前の値はゼロに設定されます。前の値よりも1桁多い2桁の数字を印刷します。
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
if [ "$oldnum" = "" ]
then
oldnum=0
fi
printf "%02d\n" $(($oldnum+1))
}
oldnumが設定されていない場合、テストは省略できます。この場合$((oldnum+1))
。$((+1))
$((${oldnum:-0}+1)) などの式を使用することもできます。詳しくはマニュアルをご覧ください。
これにより、次の機能を使用できます。
dir=somewhere/logs
ext=testfile.json
cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"