2016-09-25 5 views
0

私はWeb上で.shスクリプトを検索していますが、これを行うには何も見つかりませんでした。ファイルリストから.newファイルを作成する

この時点では、findコマンドでファイルリストを作成するスクリプトがあります。 このファイルリストは、コピーとともに使用され、別のフォルダに複製され、すべて正常に動作します。

ファイルリストを取得し、次のテストを実行するスクリプトファイルを作成します。 - ファイルがコピー先に存在しない場合は、ファイルをコピーします。 - ファイルが送信先に存在し、送信元と同じである場合は、anyhingを実行しないでください。 - ファイルが先に存在し、それが元とは別のだが、それをコピーし、それがこのファイルリストを作成するスクリプトです

を.newする拡張機能の変更した場合:

# File source to copy text files 
find /home/repo/source -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-from.txt 
sed -i 's/ /\\ /g' ../copy-from.txt 

# File destination to copy text files 
find . -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-to.txt 
sed -i 's/ /\\ /g' ../copy-to.txt 
sed -i 's/\(.\{2\}\)//' ../copy-to.txt 

# Merge source and destination files and add cp command 
paste ../copy-from.txt ../copy-to.txt > ../copy.sh 
rm ../copy-from.txt ../copy-to.txt 
sed -i 's/^/cp /' ../copy.sh 

誰かがことを願って私に正しい道を向けるか、私が探していることをするスクリプトを提供してください。

よろしく

+0

これは確かに 'rsync'と呼ばれていますか? –

+0

私はrsyncを見てきましたが、新しい場合はrsyncが.newファイルをどのように作成できるか分かりません。 – Webix

+0

重要な注意:スクリプトに.newファイルを作成し、既存のファイルを上書きしないようにします。 – Webix

答えて

0

あなたがそのようなgitなどのツールを使用する必要がありますように私には思えます。次に、2つのリポジトリを使用して、他のリポジトリからプル/マージする前にコミットを調べることができます。

あなたが説明しているのと同じようにすることを強くお勧めする場合、ここではそれを行う小さなbashスクリプトがあります。つまり、コピーするファイルのリストを含む一時ファイルは生成されず、ソースディレクトリ内のすべての新規/変更されたファイルが検索され、コピー先のディレクトリにコピーされ、必要に応じて末尾に.newが追加されます。

src='/path/to/source/dir' 
dst='/path/to/destination/dir' 
find "$src" -type f \(-name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' \) -printf '%P\0' | 
    while IFS= read -r -d '' file; do 
     if [[ ! -e "$dst/$file" ]]; then 
      cp -a -- "$src/$file" "$dst/$file" 
     elif ! cmp --silent "$src/$file" "$dst/$file"; then 
      cp -a -- "$src/$file" "$dst/$file.new" 
     fi 
    done 

cmpを使用して、2つのファイルが同一であるかどうかを判断します。これは、ファイル全体が読み込まれる可能性があるため、関係するファイルが大きい場合は遅くなる可能性があることを意味します。しかし、それは小さな設定ファイルでうまくいくはずです。もちろん、これはシェルスクリプトであり、外部プログラムを呼び出すときにたくさんのファイルを持っていれば遅くなるかもしれません。

+0

スクリプトをありがとう。 効果的には、同期のためにgit repoをローカルに作成したくありません。 と私はそのスクリプトを実行すると、私はこれを取得: '#/home/repo/update.sh /home/repo/update.sh:3行目:$ '\ r' が:コマンドは 検索が見つかりませんが。 '/ home/repo/sources \ r ':そのようなファイルやディレクトリはありません。 /home/repo/update。sh:行7:予期しないトークン 'elif 'の近くの構文エラー /home/repo/update.sh:行7:' elif! cmp --silent "$ src/$ file" "$ dt/$ file"; # ' – Webix

+0

ファイルを正しく貼り付けたことはありますか? Windowsマシンが関わっていて、改行が乱れているようです。実行する前にunix改行(LF、CRLFではなく)に変換してください。 'dos2unix'と呼ばれる便利なコマンドラインプログラムがあります。 – redneb

関連する問題