ディレクトリを選択し、エコーのみを使用して特定の方法でソートします。

ディレクトリを選択し、エコーのみを使用して特定の方法でソートします。

私はUnix環境の経験がないので、スクリプトを調整する必要があります。これは基本的な知識のようですが、グーグルでは簡単な解決策を見つけることができません。

このスクリプトは、ディレクトリ内のすべてのwebappsrvを取得して再起動します。

TMPLIST=`cd $MYWEBAPPSRV_DIR; /bin/echo *`

これにより、次のリストが返されます。

myAppSrv_1
myAppSrv_11
myAppSrv_12
myAppSrv_2
myAppSrv_3
...
myApSrv_9
somescript
somemorescriptfiles

スクリプトファイルを除いて必要なディレクトリのみを選択する方法は?数字の順序(1、2、3、...、11、12)でサーバーを再起動する必要がありますが、どうすれば順序を簡単に変更できますか?ディレクトリ名を変更できません。ディレクトリをテキストと数字の部分に分割し、数字の部分に並べ替えることは可能ですが、特別な並べ替えパラメータなどの簡単なオプションはありますか?

答え1

ジッシュほとんどのディストリビューションで使用できますが、通常はデフォルトのインストールには含まれません。インストールに問題がない場合は、そのまま使用してください。グローバル予選機能で問題を簡単に解決できます。

#!/bin/zsh
cd $MYWEBAPPSRV_DIR
TMPLIST=(*(/n))
for app in $TMPLIST; do … done

globは*すべてのファイル(ドットファイルを除く)をリストし、glob修飾子は/ディレクトリファイルのみを選択し、一連nの数字がデフォルトの事前編成順序ではなく数字でソートされるようにします。ディレクトリを変更せずにディレクトリの一部を一致から除外するには、次のようにします。歴史拡張修飾子デフォルト名部分のみを保持します。

#!/bin/zsh
TMPLIST=($MYWEBAPPSRV_DIR/*(/n:t))
for app in $TMPLIST; do … done

zsh インストールが実用的ではなく、GNU coreutils (例: Linux 以外の Cygwin など) を使用するシステムを実行していて、ファイル名に特殊文字 (スペースまたはワイルドカード) が含まれていない場合は、次のコマンドを使用してls -vファイル名を並べ替えるできます。一連の数値と-Fテキストフィルタを含むファイルの種類を表示し、ディレクトリのみを選択します。

TMPLIST=$(ls -Fv $MYWEBAPPSRV_DIR | sed -n 's!/$!!p')
for app in $TMPLIST; do … done

答え2

こう変えて…

TMPLIST=`cd $MYWEBAPPSRV_DIR; ls -l | awk '/myApp/{print $NF}' | sort -t_ -n -k2`

TMPLIST=`cd $MYWEBAPPSRV_DIR; ls -1 | awk '/myApp/' | sort -t_ -n -k2`

答え3

for (( n = 1; n < 12; ++n )); do
    for appsrv_dir in "$MYWEBAPPSRV_DIR"/*_"$n"; do
        if [[ -d "$appsrv_dir" ]]; then
             ( cd "$appsrv_dir" && somecommand )
        fi
    done
done

これは、1から12までの数字を繰り返し、$MYWEBAPPSRV_DIR名前の末尾にこの数字(前に下線付き)があるディレクトリ内のすべての項目と一致します。ディレクトリの場合は、必要な作業をすべて実行してください。この構文にはbashまたはが必要ですksh

「12」は当然$MYWEBAPPSRV_DIR

別のアプローチは、ディレクトリ名を明示的にソートすることです。まず、ディレクトリリストを作成します。

for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9]
do
    if [[ -d "$thing" ]]; then
      printf '%s\n' "$thing"
    fi
done

$MYWEBAPPSRV_DIRこれは、1桁または2桁の数字で終わるファイル名を持つディレクトリ内のすべての項目を繰り返し、_そのファイル名を標準出力に送信します(実際にはディレクトリ名の場合)。

次に、次の数字でこの名前をソートします_

for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9]
do
    if [[ -d "$thing" ]]; then
      printf '%s\n' "$thing"
    fi
done | sort -t '_' -k2,2n

名前に下線が 1 つしかないと仮定すると、サフィックスの数に基づいて名前が昇順にソートされます。このsortユーティリティは標準入力から読み取り、ソートされたディレクトリのリストを標準出力に書き込みます。

次に、次のディレクトリで実行する必要がある操作を実行します。

for thing in "$MYWEBAPPSRV_DIR"/*_[0-9] "$MYWEBAPPSRV_DIR"/*_[0-9][0-9]
do
    if [[ -d "$thing" ]]; then
      printf '%s\n' "$thing"
    fi
done | sort -t '_' -k2,2n |
while read appsrv_subdir; do
    ( cd "$MYWEBAPPSRV_DIR/$appsrv_subdir" && somecommand )
done

答え4

文字の順序(例:1、10、11、12、2、3、[...])ではな​​く、正しい数字の順序(例:1、2、3、[...]、9、10、11、12) )で並べ替えます。 、9)lsオプションでコマンドを使用でき-v、オプションを使用して1行に1つずつ印刷できます-1

TMPLIST="$(ls -v1 $MYWEBAPPSRV_DIR)"すべてのファイルが正しい順序で含まれるリストを作成するようにコマンドを変更します。

ファイルではなくディレクトリだけが欲しいと言われたことが何を意味するのかよくわかりません。間違って理解したら明確にしてください。これは、パスが与えられるとファイルの場合はいくつかのコードを実行し、ディレクトリの場合は別のコードを実行するスクリプトです。確認したいパスを$ testという変数に保存すると、うまくいきます。

if [ "$(ls -ld $test | grep '^d')" != "" ]
then echo "Directory code here"
else echo "File code here"
fi

関連情報