동일한 접두어를 가진 여러 파일이 디렉터리에 있는지 확인하고 싶습니다.
이 디렉토리 --> 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"
find
find
이름을 일치시키기 위해 쉘 glob을 사용하는 것과 파일 유형 일치에 더 엄격한 in을 사용하는 것 사이에는 미묘한 차이가 있습니다 . 유틸리티 find
는 파일이나 디렉토리에 대한 기호 링크를 파일이나 디렉토리로 감지하지 않고 기호 링크로 감지하며 쉘은 기호 링크를 역참조하고 링크 대상을 테스트합니다.
답변2
"files"의 복수형과 접두사에 대해 이야기할 때 파일 이름 $SRC_FILE_EXT
뒤에 뭔가가 있는 것 같아서 $SRC_FILE_EXT*
.
그러나 이는 하나의 인수만 요구하면서 여러 일치 항목을 제공할 수 있습니다 test -s
.
따라서 테스트를 수정하는 것이 좋습니다.
if [ "$(find . -name \"${WORK_DIR}/${SRC_FILE_EXT}*\" )" != "" ]; then