私のサーバーを構成するための多くのシェルスクリプトを含むフォルダがあります。
私のデフォルトスクリプトの名前は "setup.sh"で、他のすべてのスクリプトの名前は0.script.sh、1.script.sh ...、より一般的にはN.SCRIPT_NAME.shです。ここで、Nは実行番号です。
したがって、そのフォルダ内のすべてのシェルスクリプトを一覧表示し、N番号で指定された順序で実行しようとしています。
答え1
zshを使用してファイル名を順番に取得する簡単な方法があるかもしれませんが、以下はbashの無差別アプローチです。
for script in ?.script*.sh ??.script*.sh ???.script*.sh ????.script*.sh
do
printf "Executing script: %s\n" "$script"
./"$script"
done
これは、スクリプトのファイル名のプレフィックス部分に9999個以下、より正確には4個以下の数字(文字)があると仮定します。
また、プレフィックスが次のようになると仮定します。番号付き- それ〜するたとえば、名前付きスクリプトを選択します(go.script_X.sh
存在する場合)。解決策それ?
は次のように置き換えられます[0-9]
。
for f in [0-9].script*.sh [0-9][0-9].script*.sh ...
シェルの自然なグロービングメカニズムは、結果ファイル名をアルファベット順にソートするため、数値順にもソートされます。いろいろなファイル名はますます比率で表記されるので、「9」が「101」の前に来る式です。
zsh では、プレフィックスに基づいて数値順に glob ファイル名を指定します。
for script in *.script*.sh(oe_'REPLY=${REPLY%%.*}'_n)
do
printf "Executing script: %s\n" "$script"
./"$script"
done
*.script*.sh
globbing 拡張は、まずすべてのファイルを選択し、次にできるだけ多くの「ドットの後にあるすべて」を削除し、プレフィックスを抽出する式を使用してo
ファイルをソート(整列)し、数値でソートします。e
n
答え2
ファイル名が単純な場合(空白なし、改行文字なし、lsでエンコードする必要がある文字なし?
)、そうであればおそらく可能です! ! 、以下を削除できます。
IFS=$' \t\n'; for s in $(ls -v folder/*.script.sh); do printf '%s\n' "$s"; done
この場合、ソートはバージョン番号(数値と同様)ls
に基づいて行われます。-v
しかし、通常、出力を解析(処理)するのは悪い考えですls
。
これが良いです:
shopt -s nullglob
for s in folder/?{,?{,?{,?}}}.script.sh
do printf '%s\n' "$s"
done
.script.sh
それぞれ最大4文字(数字)でリストされます(アルファベット順、前の文字が数字の場合は数字順と同じ)。
アイデアは支柱の拡張前に起こったパス名拡張。これ支柱の拡張?{,?{,?{,?}}}.script.sh
に変換され、拡張されます。
?.script.sh ??.script.sh ???.script.sh ????.script.sh
次に、パス名拡張各パターンに一致するすべてのファイルを見つけ、各パターンを順番に並べ替えます。
上記のいずれのオプションも問題を解決できない場合は、以下を使用する必要がありますsort
。
printf '%s\n' *.script.sh | sort -n | xargs echo
プレフィックスがあると、folder
状況はより複雑になります。
printf '%s\n' folder/*.script.sh | sort -n -k 1.8 | xargs echo
ここで、8は単語の文字数(バイト)で、folder
その後に/
1が続きます。
echo
置換を使用して各スクリプトを実行する必要がありますsh
。この方法は、ファイル名に改行文字が含まれていない場合は正しく機能します。
ファイル名に改行文字を含めることができる場合は、次のコマンドを使用してください。
printf '%s\0' folder/*.script.sh | sort -zn -k 1.8 | xargs -0 -I{} echo '{}'
もう一度(または)echo
に置き換えてスクリプトを実行します。sh
bash