仅使用 echo 选择目录并以特定方式排序

仅使用 echo 选择目录并以特定方式排序

我对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名称末尾包含此数字的任何内容(前面带有下划线)。如果它是一个目录,请对它执行任何您需要执行的操作。此语法需要bashksh

“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文件名结尾为_后跟一位或两位数字的所有内容,并将这些文件名发送到标准输出(如果它们实际上是目录名称)。

然后根据后面的数字对这些名称进行排序_

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

假设名称中只有一个下划线,这将根据后缀中的数字按升序对名称进行排序。该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, 2, 3, [...], 9, 10, 11, 12)而不是字符排序(例如 1, 10, 11, 12, 2, 3, [.. .], 9) 您可以使用ls带选项的命令-v,并使用选项每行打印一个-1

将命令更改为TMPLIST="$(ls -v1 $MYWEBAPPSRV_DIR)"创建一个列表,其中所有文件均按正确顺序排列。

当你说你只想要一个目录,而不是一个文件时,我不完全确定你的意思。如果我误解了,请澄清。这是一个脚本,给定路径,如果它是文件,则将执行一些代码;如果它是目录,则将执行不同的代码。将要检查的路径存储在名为 $test 的变量中,以使其正常工作。

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

相关内容