目的:今日の日付を含むバックアップの.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
1行に1つのファイルがあることを確認し、印刷できない文字をに置き換えてもパターンの動作に?
影響を与えないため、grep
比較的安全でなければなりません。
ファイル名に有効な文字を構成しない一連のバイトが含まれている場合、違いが表示されることがあります。 1つの利点は、現在のディレクトリを読み取れない場合はエラーメッセージが表示されることです。
答え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 ) $?