したがって、同じファイルを持つ2つのディレクトリがあります。ただし、ディレクトリaには今日のデータがあり、ディレクトリbには昨日のデータがあります。私が望むのは、ファイルを比較して結果を3つの列に出力することです。これはファイル名、ファイルが同じかどうか、ファイルが同じ日数です。
私が今まで持っているのは次のとおりです。
ls ./dropzone_current > files.txt
is_identical=false
filename="files.txt"
while read -r line
do
name="$line"
declare -i counter
diff -qs ./dropzone_current/$name ./dropzone_backup/$name
if [ $? -ne 0 ]
then
is_identical=false
counter=0
printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt
else
counter=$((counter + 1))
is_identical=true
printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt
fi
done < "$filename"
デフォルトでは、カウンターを除くすべてがうまく機能します。比較される各ファイル名に対してカウンタは一意である必要があり、スクリプトが実行されるたびに(1日に1回)更新される必要がありますが、これを行う方法はわかりません。
ベストアンサー1
私の他の答えとあなたの質問に対する意見に基づいて、あなたが実際に探しているのは、ファイルセットの変更を追跡する方法のようです。これはしばしばバージョン(または改訂)制御と呼ばれます。一般的にシステムにインストールされている一般的なエンジンの一つはgit
。
これを達成するには、ファイルのコピーを保存し、その中のすべての変更を追跡する「ストレージ」を保存する場所を選択してください。私たちはこれを場所と呼びます/path/to/repository
。ディレクトリを作成してコマンドを実行しますgit init
。これでリポジトリが設定されます。ファイルをディレクトリにコピーすると、現在の状態をリポジトリに「コミット」します。
git add *
git commit -m "Initial commit of files"
その後、転送場所を確認し、必要に応じてリポジトリを更新できます。
#!/bin/bash
repo='/path/to/repository'
dropbox='/path/to/delivery/'
cd $repo
for file in *; do
if ! diff "${repo}/$file" "${dropbox}/$file"; then
cp -p "${dropbox}/$file" ${repo}/
git add "$file"
fi
done
git commit -m "Update for $(date)"
これは、名前にスペースが含まれているファイルやフィードに追加または削除されたファイルを処理しない高速で汚れたスクリプトですが、これは開始点です。