Shell

僅使用 echo 以特定方式選擇目錄和順序

  • January 21, 2017

我在 Unix 環境中沒有經驗,必須調整腳本。我想這是基本知識,但我無法通過Google搜尋找到一個簡單的解決方案。

該腳本獲取目錄中的所有 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)重新啟動?我無法重命名目錄。我知道可以將目錄分解為文本和數字部分,然後按數字部分重新排序,但是有沒有更簡單的選項,比如特殊的排序參數?

像這樣改變它..並試一試

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`

Zsh在大多數發行版上都可用,但通常不是預設安裝的一部分。如果安裝它不是問題,請使用它,因為它的glob 限定符功能很容易解決您的問題:

#!/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

引用自:https://unix.stackexchange.com/questions/337081