shell - 複数 - シェルスクリプトにファイルが存在するかどうかを確認する方法




シェルスクリプト ファイル 存在 ワイルドカード (4)

NFSを使用している場合は、NFSがダウンした場合にタイムアウトを追加できるため、「テスト」の方が優れたソリューションです。

 time timeout 3 test -f /nfs/my_nfs_is_currently_down real 0m3.004s <<== timeout is taken into account user 0m0.001s sys 0m0.004s echo $? 124 <= 124 means the timeout has been reached 

「[-e my_file]」コンストラクトは、NFSが再び機能するまでフリーズします。

 if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi <no answer from the system, my session is "frozen"> 

特定のファイル archived_sensor_data.json が存在するかどうかを確認し、存在する場合はそれを削除するシェルスクリプトを作成したいと思います。 http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html に従って、私は次のことを試しました:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

ただし、これはエラーをスローします

[-e: command not found

./test_controller コマンドを使用して、結果の test_controller スクリプトを実行しようとすると。 コードの何が問題になっていますか?


ブラケットと -e 間に必要なスペースがありません:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi

私が推奨するソリューションの背景には、友人が、最初の仕事の2週間目までにビルドサーバーの半分を完全に削除したという話があります。 そのため、基本的なタスクはファイルが存在するかどうかを把握することであり、存在する場合は削除します。 しかし、この川にはいくつかの危険な急流があります。

  • すべてがファイルです。

  • スクリプトは、一般的なタスクを解決する場合にのみ有効です

  • 一般的には、変数を使用します

  • 手動の介入を避けるために、スクリプトで-f forceをよく使用します

  • また、-rを再帰的に使用して、タイムリーに作成、コピー、および破棄するようにします。

次のシナリオを検討してください。

削除するファイルがあります:filesexists.json

このファイル名は変数に保存されます

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

また、物事を本当に柔軟にするためにパス変数を持っています

<host>:~/Documents/thisfolderexists pathtofile=".."

<host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

それでは、 -e が想定 -e 機能するかどうかを見てみましょう。 ファイルは存在しますか?

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

します。 魔法。

ただし、ファイル変数が誤ってnuffinに評価された場合はどうなりますか

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

何? エラーで戻ることになっています...そしてこれは、そのフォルダ全体が誤って削除された物語の始まりです

別の方法として、「ファイル」であることがわかっているものをテストすることもできます。

<host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

したがって、ファイルが存在します...

<host>:~/Documents/thisfolderexists filevariable=""

<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

したがって、これはファイルではなく、おそらくディレクトリ全体を削除したくない

man test には次のことを言う必要があります。

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)

ls を使用した代替方法は次のとおりです。

(ls x.txt && echo yes) || echo no

ls からの出力を非表示にして、yesまたはnoのみが表示されるようにするには、 stdoutstderr/dev/null にリダイレクトし /dev/null

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no




shell