今日私が書いたCMSで小さなバグを見つけました。さて、同じファイル名でサーバー上のすべてのファイルを書き換えたいと思います。ただし、特定のファイルをカスタマイズする一部のクライアントがあるため、そのファイルをすべて無視することはできません。
一部の顧客はカスタムファイルを持っているため、ファイルサイズを確認する必要があります。
ファイルサイズがソースと異なる場合は上書きする必要があります。ファイルサイズが同じ場合は、ファイルをスキップする必要があります。
数ヶ月前、私は1つのソースから複数のファイルを上書きする方法についてかなり似た質問をしました。私もこの問題を解決しました。
echo /home/*/*/phpthumb | xargs -t -n 1 cp -r /home/test/testuser/phpthumb/*
ファイルを書き換えるかスキップするためにif / elseがほとんどない.shスクリプトでこれを使用できますか?では、どうすればこれを達成できますか?
私のUnixの経験は非常に平均的なので、質問が明確でない場合は、お気軽にお問い合わせください。
ありがとうございます。
答え1
私は、あるサーバーのソースファイルの1つでソースコードを変更し、修正を別のサイトに移植したいとします。そうですか?元のファイルのコピーを保存している場合(プロジェクトが記憶されていないときは常に保存します)、最高の資産を使用してくださいdiff
。 ::
diff -Nau old/file new/file > file.patch
SSHを使用すると、すべてのサーバーにパッチを適用するために使用できるソースソースファイルと変更されたソースファイルの違いを確認できます。たとえば、次のようになります。
# See what's to be done, no action
cat file.patch | ssh server "patch -d <directory> --dry-run"
# Apply the patch if all seems good
cat file.patch | ssh server "patch -d <directory>"
変更されていないコピーが変更されたファイルとは異なるディレクトリにある場合は、パッチヘッダーを調整する必要があるかもしれません。ただし、デフォルトでは両方とも同じディレクトリ、file.php
つまり固定ファイルとfile.php.orig
元のファイルにある場合は、cd
Webサイトのルートに移動してdiff
次のコマンドを実行します。
cd /home/www/htdocs/www.mysite.tld
diff -Nau some/deep/dir/file.orig.php some/deep/dir/file.php > /tmp/file.patch
他のウェブサイトのルートディレクトリから:
# See what's to be done, no action
patch -d /home/www/htdocs/www.my.other.site.tld --dry-run < /tmp/file.patch
# Apply the patch if all seems good
patch -d /home/www/htdocs/www.my.other.site.tld < /tmp/file.patch
他の有用な引数はです-p
。diff
どちらもpatch
ディレクトリツリーを操作して、変更を繰り返し適用できます。より複雑なパッチを単一のファイルにリンクしてビルドすることもできます。使用方法の詳細については、およびをpatch --help
ご覧ください。diff --help
答え2
元の質問をそのままにしてこれが欲しいものですが、以下の私のコメントを参照してください。find
正しいファイルがあることを確認するために、まずそのセクション自体を試してみることもできます。
find /home -maxdepth 3 -mindepth 3 -path */phpthumb/filename ! -size xxxx |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
私の意見に従って動作し、同じサイズを変更するには!
。
修正する
実際にMD5を比較する方が良い方法です。カスタムファイルの1つのサイズが同じである可能性があるため、より強力です。あなたは試すことができます:
original_md5=$(md5sum /path/to/original | awk '{print $1}')
echo /home/*/*/phpthumb/filename |
xargs md5sum |
grep "^$original_md5" |
awk '{print $2}' |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
これにより、元のファイルと一致するすべてのファイルが置き換えられます。あなたの質問のようにこれをそのまま実行するには、に-v
オプションを追加しますgrep
。また、検索パスにスペースが含まれている場合、これらの答えのいずれも機能しません(以前の質問の後にスペースが追加された場合)。