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