web-dev-qa-db-ja.com

ファイルをチェックするライナーが1つ存在します

目的:今日の日付を含むバックアップ.tgzファイルの存在を確認します。 OKの場合は1、ファイルがない場合は0を出力します。

私は1つのライナーの吸盤です:)たとえば、PHP(そしてJavascriptでもかなり似ています)の例では、さまざまなシナリオで次のようなことをしたい

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

Bashにも同様の構文はありますか? -f FILENAMEを使用して通常のファイルの存在を確認する方法を知っています。コマンドに1または0だけを出力させたいです:)

9
DavDav

あなたは単にこれを行うことができます:

#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で機能するはずです

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

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...
_

POSIXly

_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つのファイルがあり、印刷できない文字が_?_に置き換えられていることを確認しています。パターンのgrepingには影響しないので、比較的安全です。

ファイル名に有効な文字を形成しないバイトのシーケンスが含まれている場合、違いが見られることがあります。 1つの利点は、現在のディレクトリが読み取れない場合にエラーメッセージが表示されることです。

9

次のコマンドを使用できます。

test -e *$(date).tgz && echo 1 || echo 0
5
mrc02_kr

さらに別の変形として、探していたファイル名の正確な形式がわかっている場合は、

[ ! -f FILENAME ]; echo $?

または

echo `[ ! -f FILENAME ]` $?

ただし、これはワイルドカードに対応できなかったため、今日の日付を含む.tgzで終わるファイルには、次のようなより複雑なものが必要になります。

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

あなたがBashを要求したのは知っていますが、機能するコマンドラインプログラムを探している場合は、Pythonをお勧めします。

python -c "import os; exists = os.path.isfile('myFile.txt'); print(int(exists))"
0
user1717828
ls filename 2> /dev/null && echo 1 || echo 0

または、変数に入れたい場合

EXISTS=$(ls filename 2> /dev/null && echo 1 || echo 0)
0
pkuhar