
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
私は文字列と変数を引用したことがわかります。厳密に言えば、ここでは必ずしも必要ではありませんが、単一のタグとして扱いたいことをすべて引用する習慣を挙げるのが良いかもしれません。
また、変数に中かっこ構文を使用しました。繰り返しますが、この場合はこれは必要ないかもしれませんが、一般的なベストプラクティスだと思います。中かっこ構文の詳細については、次の記事を参照してください。
答え2
diff -q <(ls -1 $dir1 | wc -l) <(ls -1 $dir2 | wc -l)
LS-1ファイルのリストを1行に1つずつ提供します。
トイレ-l行を数える
編集する:
for file in $(sort -u <(ls -1 $dir1/; ls -1 $dir2/)); do echo $file; diff -q <(checksumcommand $dir1/$file) <(checksumcommand $dir2/$file); done