목표: 오늘 날짜가 포함된 백업 .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 형식으로 출력하고 .tgz
10진수로 끝납니다. 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 ) $?