ファイルが存在するか、空でないか、他のファイルと同じであることを確認してください。

ファイルが存在するか、空でないか、他のファイルと同じであることを確認してください。

ファイルが存在するか、空でないか、他のファイルと同じかどうかを確認したいと思います。もしそうなら、何もしないでください。

同じでない場合はを使用してくださいcat "some text"

ファイルが存在しないか空であってもファイルを生成します。cat some text

いくつかの回避策を試しましたが、ある条件を満たすたびに別の条件が失敗するか、ファイルが存在しない場合は失敗します。

この問題を解決する最もクリーンな方法は何ですか?これらすべてがbashを使用していますか?

答え1

if [ -f file1 ] && [ -s file1 ] && [ -f file2 ] && [ -s file2 ] &&
    cmp file1 file2 &>/dev/null; then
    : do nothing in this case only
else
    echo "some text" >file1
    echo "some text" >file2 # or cp file1 file2
fi

コメントに基づく短いバージョン

if [ -s file1 ] && cmp file1 file2 &>/dev/null; then
    : do nothing in this case only
else
    echo "some text" >file1
    echo "some text" >file2 # or cp file1 file2
fi

答え2

一つ作る

if ! ( [[ -s file1 ]] && cmp file1 file2 2>/dev/null 1>&2 )
then
  echo "some text" >file1
  cp file1 file2
fi

説明する:

-s file1 file1 が存在し、空でない場合は true と評価されます。

両方のファイルが存在し、同じ場合、cmpコマンドはステータスコードを0に設定します。

この場合、我々はそれらに触れたくないので、条件を無効にするために前に感嘆符を入れました。

答え3

使用cmp -sオプション:

#!/bin/bash

if ! ( [[ -s file1 ]] && cmp -s file1 file2 )
then
    echo "some text" > file1
    cp file1 file2
fi

この-sオプションはすべての出力を自動的に削除し、終了stdoutステータスstderrのみを返します。

関連情報