tarファイルが存在することを確認します。

tarファイルが存在することを確認します。

作成したいtarファイルがすでに存在するかどうかをテストしようとしています。そうでなければtarファイルを生成したいです(コードのこの部分はうまくいきます)。ただし、tarファイルのファイル名が存在するかどうかをテストするifステートメントは機能しません(tarファイルが存在するかどうかを実際にテストせずにtarファイルがすでに存在していても、elseステートメントに直接ジャンプするだけです)。どんなアイデアがありますか?

注:fire_dir_nameは圧縮したいファイルの名前です(例:myfile1.txt)。

#create variable for new name of file/dir
date=$(date +"%Y%m%d")
new_name="$file_dir_name.$date"
file_name="$new_name.tar"
echo $file_name

#check if tar file exists already
if [ -f "$file_name" ]
then
        echo "$file_name" exists
else

        # create tar file 
        tar -cvf $dir_path/$new_name.tar $file_dir_name -C $dir_path

答え1

ここで重要なのは、作成中の同じファイル名をテストする必要があることです。

#check if tar file exists already
if [ -f "$file_name" ]
then
        ...
else
        # create tar file 
        tar -cvf "$file_name" ...
        ...
fi

file_nameまた、フルパスになることができない理由もありません。

file_name="$dir_path/$new_name.tar"

ディレクトリを変数名に入れると、エラーが発生する可能性が低くなります。変数tar_nameなどtar_pathを呼び出す方が良いスタイルです。

答え2

該当する条項を見逃した部分を無視すると、fi電話する前に問題の本質が変わりますtar

欲しいと仮定

  • というファイルを作成します。$newname

  • ディレクトリエントリの場合$file_dir_name

  • ~へ$dir_path

cdそのフラグから始める必要があります$dir_path。そのフラグが移植可能かどうかはわかりませんが、-C最新のpaxコマンドには複雑さを減らす明確な理由はありません。

フラグの使用には別の問題があります-C。 $dir_pathが相対的な場合、誤った場所にtarballが生成されます。

$file_nameファイルの存在確認が失敗した理由は、そのファイルが存在する必要があるディレクトリに変更していないためです。

次に、出力先をtarballのファイル名として指定し、asオペランドをコマンド$file_dir_nameとして指定します。tar/pax

拡張コマンド:

...

#check if tar file exists already
cd "$dir_path"

if [ -f "$file_name" ]
then echo "$file_name" exists
else
  pax -w -f "$file_name" "$file_dir_name"
  ## alternatively, with tar:
  # tar cf "$file_name" "$file_dir_name"
fi

この時点で、私は変数名があまりにも$file_name一般的でした$tarball

ボーナスで変数名を減らすことを検討できます。

  1. $wdcd競合せずに予想される作業ディレクトリの良い名前です。pwd

  2. $f私は通常、ファイルや「ディレクトリエントリ」のようにディレクトリ$dオペランドに使用します。

関連情報