フォルダーをコピーすることは、隠しファイル、シンボリックリンク、またはスクリプトにとって有用な日付を含むディレクトリがある日まで平凡に思えることがあります。 cp -r はディレクトリツリーをコピーしますが、cp -a は属性を変更せずに作業ディレクトリを複製するための最良の選択であることが多いです。
ソースを削除する前に、コピーを作成し、確認し、いくつかのファイルを開いてください。成功したコマンドは、正しいパスを指定したことを証明するものではありません。

cp -r と cp -a の選択
cp -r はサブフォルダー内に移動します。ドットで始まるエントリは、フォルダー自体をコピーするときに適切に含まれます。しかし、隠しファイルも期待している場合は、*のようなグロビングを避けてください:シェルはデフォルトでそれらを無視します。
cp -a はアーカイブモードを有効にします。できる限り、権限、所有者、日付、シンボリックリンク、物理リンクを保持します。ローカルバックアップやディレクトリの移行には、通常、このコマンドが推奨されます。あなたのアカウントでは定義できない所有者を保持する必要がある場合、特権が必要なことがあります。
cp -a -- /srv/app/ /srv/app-copie/
-- はオプションとパスを分けます。これにより、ハイフンで始まるファイルがオプションとして解釈されるのを防ぎます。ソースの末尾のスラッシュは、/srv/app-copie/内にその内容をコピーしていることを意味します。このフォルダーがすでに存在する場合は、続行する前に得られた構造を確認してください。
誤って悪いフォルダーを上書きしないための宛先の準備
まずはっきりと命名された宛先を作成し、次に両側をリストします。サーバー上では、スクリプト内の手動で構築されたパスへの再帰的なコピーをログに表示せずに開始しないでください。
mkdir -p -- /srv/app-copie
find /srv/app -maxdepth 1 -printf '%fn' | sort
find /srv/app-copie -maxdepth 1 -printf '%fn' | sort
最初の試行中にすべての上書きを拒否したい場合は、-nを追加してください。このオプションは、すでに存在するファイルを無視するため、完全な同期には適していません。既存のデータを置き換えるには、バックアップを取るか、新しいディレクトリで作業し、検証されたコピーにサービスを切り替えてください。
ファイル、権限、およびリンクの確認
まず、隠しファイルと権限を確認してください。 ls -la はドットで始まる名前を表示します。 stat を使用すると、重要なファイルの権限や日付を比較することができます。
ls -la /srv/app
ls -la /srv/app-copie
stat -c '%n %a %U:%G %y' /srv/app/config.ini /srv/app-copie/config.ini
find /srv/app-copie -type l -ls
最後のコマンドはシンボリックリンクをリストします。 cp -a を使用すると、リンクは通常リンクのままです。適切でないコピーを行った場合、ターゲットの内容や、移動後に無効なリンクになる場合があります。
- ファイルをカウントするには
find ... -type f | wc -l; - 最も重要な設定ファイルを開く;
- ソースを削除する前に、コピーに対してプログラムをテストする;
- サービスまたはスクリプトが機能テストを通過するまでソースを保持します。
2つのツリーの内容を比較するには、diff -qr /srv/app /srv/app-copie が異なるファイルを報告します。これはアプリケーションの検証の代わりにはなりませんが、不完全なコピーを迅速に検出します。
重複後に権限を修正する必要がある場合は、Linuxでの再帰的chmodガイドを参照してください。あまりにも早くchmod -Rを実行すると、実行可能ファイルが壊れる理由が説明されています。コピー前にファイルを見つけるには、Linuxでのfindも使用できます。