2つのディレクトリ間のファイルの合計を確認してください。

2つのディレクトリ間のファイルの合計を確認してください。

2つのディレクトリ間のファイルチェックサムを確認したいと思います。

これを行うには、次のスクリプトを作成しました。

#!/bin/bash

echo Checking File Copy

SRC_DIR=/home/user/src

echo Source Directory: $SRC_DIR

TGT_DIR=/media/user/tgt

echo Target Directory: $TGT_DIR

cd $SRC_DIR

for file_name in *.txt
do
 echo $file_name
 tgt_file=${file_name// /\\ }
 sum $TGT_DIR/$tgt_file
 sum $file_name
done

スクリプトは名前にスペースが含まれるファイルが見つかるまでうまく機能しますが、その時点でエラーが発生します。

私は次のようにファイル名を「エスケープ」してこの問題を解決しようとしました。

tgt_file=${file_name// /\\ }

残念ながら、これはファイル名を読み取るときにエラーを引き起こします。

検索しましたが、動作する回答が見つかりませんでした。どんな提案でも歓迎します。ありがとうございます。

ベストアンサー1

あなたはしません二重引用符あなたの変数の一つ。二重引用符で囲まれた文字列(変数を含む文字列を含む)は単一のトークンとして扱われます。それ以外の場合は、スペースで区切られたトークンのリストとして扱われます。後ろにスペースが表示されても動作します。パラメータ拡張- あなたの場合と同じです。

これがなぜ重要なのかについては、次の記事をご覧ください。

スクリプトは次のとおりです。

#!/bin/bash

echo "Checking File Copy"

SRC_DIR="/home/user/src"

echo "Source Directory: ${SRC_DIR}"

TGT_DIR="/media/user/tgt"

echo "Target Directory: ${TGT_DIR}"

cd "${SRC_DIR}"

for file_name in *.txt
do
 echo "${file_name}"
 sum "${TGT_DIR}/${file_name}"
 sum "${file_name}"
done

私は文字列と変数を引用したことがわかります。厳密に言えば、ここでは必ずしも必要ではありませんが、単一のタグとして扱いたいことをすべて引用する習慣を挙げるのが良いかもしれません。

また、変数に中かっこ構文を使用しました。繰り返しますが、この場合はこれは必要ないかもしれませんが、一般的なベストプラクティスだと思います。中かっこ構文の詳細については、次の記事を参照してください。

おすすめ記事