디렉토리를 선택하고 에코만을 사용하여 특정 방식으로 정렬합니다.

디렉토리를 선택하고 에코만을 사용하여 특정 방식으로 정렬합니다.

저는 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, 10, 11, 12, 2, 3, [.. .])가 아닌 올바른 숫자 순서(예: 1, 2, 3, [...], 9, 10, 11, 12)로 정렬합니다. , 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

관련 정보