디렉터리에 여러 파일이 있는지 확인하는 Bash 명령

디렉터리에 여러 파일이 있는지 확인하는 Bash 명령

동일한 접두어를 가진 여러 파일이 디렉터리에 있는지 확인하고 싶습니다.

이 디렉토리 --> WORK_DIR및 파일 접두어 -->SRC_FILE_EXT

현재 다음과 같은 스크립트가 있습니다.

if [ -s ${WORK_DIR}${SRC_FILE_EXT} ] ;  then
   echo "+ File is present on the source directory" >> $LOG_FILE
else

   echo "No files to move" >> $LOG_FILE
   exit 4
fi

하지만 이 스크립트는 No files to move를 발생시킵니다.

누구든지 나를 도와줄 수 있나요?

답변1

shopt -s nullglob

set -- "$WORK_DIR/$SRC_FILE_EXT"*

printf 'There are %d names that match "%s"\n' "$#" "$WORK_DIR/$SRC_FILE_EXT*"

즉, 관심 있는 이름과 일치하는 패턴을 확장하고 위치 매개변수를 설정합니다. 특수 변수에는 $#일치하는 이름의 수가 포함됩니다. 패턴이 전혀 일치하지 않는 경우 패턴이 아무것도 확장되지 않도록 하는 nullglob쉘 옵션을 설정하십시오 .bash

디렉터리가 일치하지 않는지 확인하려면 간단한 루프를 사용하여 디렉터리가 아닌 수를 계산할 수 있습니다.

shopt -s nullglob

num=0
for name in "$WORK_DIR/$SRC_FILE_EXT"*; do
    [ ! -d "$name" ] && num=$(( num + 1 ))
done

printf 'There are %d non-directories with names that match "%s"\n' "$num" "$WORK_DIR/$SRC_FILE_EXT*"

사용 find:

find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l

( find비표준 -maxdepth술어를 이해한다고 가정). $WORK_DIR이름이 로 시작하는 디렉토리가 아닌 수를 반환합니다 $SRC_FILE_EXT.

num=$( find "$WORK_DIR" -maxdepth 1 ! -type d -name "$SRC_FILE_EXT*" -exec echo x \; | wc -l )

printf 'There are %d non-directories with names that match "%s" in "%s"\n' \
    "$num" "$SRC_FILE_EXT*" "$WORK_DIR"

findfind이름을 일치시키기 위해 쉘 glob을 사용하는 것과 파일 유형 일치에 더 엄격한 in을 사용하는 것 사이에는 미묘한 차이가 있습니다 . 유틸리티 find는 파일이나 디렉토리에 대한 기호 링크를 파일이나 디렉토리로 감지하지 않고 기호 링크로 감지하며 쉘은 기호 링크를 역참조하고 링크 대상을 테스트합니다.

답변2

"files"의 복수형과 접두사에 대해 이야기할 때 파일 이름 $SRC_FILE_EXT뒤에 뭔가가 있는 것 같아서 $SRC_FILE_EXT*.

그러나 이는 하나의 인수만 요구하면서 여러 일치 항목을 제공할 수 있습니다 test -s.

따라서 테스트를 수정하는 것이 좋습니다.

if [ "$(find . -name \"${WORK_DIR}/${SRC_FILE_EXT}*\" )" != "" ]; then

관련 정보