POSIX적으로

POSIX적으로

목표: 오늘 날짜가 포함된 백업 .tgz 파일이 있는지 확인하세요. 출력이 1이면 OK, 0이면 파일이 없음을 의미합니다.

저는 라이너의 열렬한 팬입니다 :) 예를 들어 PHP(Javascript와 매우 유사)에서 다양한 시나리오에서 다음과 같은 작업을 수행하는 것을 좋아합니다.

<?php
echo (date("d")==1)?"Monday":"Not Monday";
?>

Bash에도 비슷한 구문이 있나요? -f FILENAME을 사용하여 일반 파일이 존재하는지 확인하는 방법을 알고 있습니다. 명령이 1 또는 0을 인쇄하기를 원합니다. :)

답변1

간단히 이렇게 할 수 있습니다:

#to check if it's a regular file
[ -f "/you/file.file" ] && echo 1 || echo 0
#to check if a file exist
[ -e "/you/file.file" ] && echo 1 || echo 0

셸에서 이 문자는 [테스트를 나타냅니다. -e파일이 있으면 ]테스트가 종료됩니다. &&명령이 true를 반환하면 후속 명령이 실행됩니다 ||.
이는 shell다음과 같은 목적으로 작동해야 합니다.bash

답변2

if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi

답변3

그리고 zsh:

(){echo $#} *"$(date +%Y-%m-%d)"*.tgz(DN)

이름에 현재 날짜가 포함된 현재 디렉터리의 파일 수를 YYYY-mm-dd 형식으로 출력하고 .tgz10진수로 끝납니다. 0 또는 1만 필요한 경우 (DN)로 바꾸십시오.(DN[1])

명령문에서 조건으로 사용하려면 if다음을 수행할 수 있습니다.

if ()(($#)) *"$(date +%Y-%m-%d)"*.tgz(DN); then
   echo found
else
   echo none found
fi

존재하다bash

이에 상응하는 내용은 다음과 같습니다.

(shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; echo "$#")

( 0 또는 1을 얻으 "$#"려면 교체하십시오 "$(($#>0))").

그리고

if (shopt -s nullglob dotglob; set -- *"$(date +%Y-%m-%d)"*.tgz; (($#))); then
   echo found
else
   echo none found
fi

그리고 ksh93:

(FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; echo "$#")

그리고

if (FIGNORE='@(.|..)'; set -- ~(N)*"$(date +%Y-%m-%d)"*.tgz; (("$#"))); then...

POSIX적으로

ls -qA | grep -c "$(date +%Y-%m-%d).*\.tgz$"

계산을 위해.

ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; echo "$(($? == 0))"

0 또는 1의 경우:

그리고:

if ls -qA | grep -q "$(date +%Y-%m-%d).*\.tgz$"; then...

상식적으로 출력을 구문 분석하는 것은 아니지만 ls여기에 사용된 것처럼 -q한 줄에 하나의 파일이 있는지 확인하고 인쇄할 수 없는 문자를 로 바꾸더라도 패턴의 동작에 ?영향을 미치지 않으므로 grep상대적으로 안전해야 합니다.

파일 이름에 유효한 문자를 구성하지 않는 일련의 바이트가 포함되어 있으면 차이가 나타날 수 있습니다. 한 가지 장점은 현재 디렉터리를 읽을 수 없으면 오류 메시지가 표시된다는 것입니다.

답변4

또 다른 변형으로, 찾고 있는 파일 이름의 정확한 형식을 알고 있는 경우 다음을 사용할 수 있습니다.

[ ! -f FILENAME ]; echo $?

또는

echo `[ ! -f FILENAME ]` $?

그러나 이것은 와일드카드를 처리할 수 없으므로 오늘 날짜를 포함하는 .tgz로 끝나는 파일에는 더 복잡한 것이 필요합니다.

echo $( for entry in *$(date --rfc-3339=date)*.tgz; do [ -f "$entry" ] && exit 1; done; exit 0 ) $?

관련 정보