目的:今日の日付を含むバックアップ.tgzファイルの存在を確認します。 OKの場合は1、ファイルがない場合は0を出力します。
私は1つのライナーの吸盤です:)たとえば、PHP(そしてJavascriptでもかなり似ています)の例では、さまざまなシナリオで次のようなことをしたい
<?php
echo (date("d")==1)?"Monday":"Not Monday";
?>
Bashにも同様の構文はありますか? -f FILENAMEを使用して通常のファイルの存在を確認する方法を知っています。コマンドに1または0だけを出力させたいです:)
あなたは単にこれを行うことができます:
#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を返した後、コマンドを実行します||
ifコマンドがfalseを返した後、コマンドを実行します。
これはShell
およびbash
で機能するはずです
if [ ! -f /tmp/foo.txt ]; then echo "File not found!"; else echo "file found"; fi
zsh
の場合:_(){echo $#} *"$(date +%Y-%m-%d)"*.tgz(DN)
_
名前に現在の日付が含まれる現在のディレクトリ内のファイル数をYYYY-mm-dd形式で出力し、10進数として_.tgz
_で終了します。 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...
_
_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
ingには影響しないので、比較的安全です。
ファイル名に有効な文字を形成しないバイトのシーケンスが含まれている場合、違いが見られることがあります。 1つの利点は、現在のディレクトリが読み取れない場合にエラーメッセージが表示されることです。
次のコマンドを使用できます。
test -e *$(date).tgz && echo 1 || echo 0
さらに別の変形として、探していたファイル名の正確な形式がわかっている場合は、
[ ! -f FILENAME ]; echo $?
または
echo `[ ! -f FILENAME ]` $?
ただし、これはワイルドカードに対応できなかったため、今日の日付を含む.tgzで終わるファイルには、次のようなより複雑なものが必要になります。
echo $( for entry in *$(date --rfc-3339=date)*.tgz; do [ -f "$entry" ] && exit 1; done; exit 0 ) $?
あなたがBashを要求したのは知っていますが、機能するコマンドラインプログラムを探している場合は、Pythonをお勧めします。
python -c "import os; exists = os.path.isfile('myFile.txt'); print(int(exists))"
ls filename 2> /dev/null && echo 1 || echo 0
または、変数に入れたい場合
EXISTS=$(ls filename 2> /dev/null && echo 1 || echo 0)