busybox version 1.33.0
フォルダ全体をコピーしようとしていますhome
。
home
取り付けられた内部は/dev/sda2/
次のとおりです。
/home/user/sda2
/home/user/sda2/root
/home/user/sda2/home_backup
root/
上記では、実際に持っているディレクトリを見ることができます。また、 のデータを保存することがあります。sda2/
root
home_backup/
/home
私の質問は次のとおりです
次の行を実行すると、素晴らしいファイルのリストとその/home/user/sda2
内容が見つかりません。これが私が望むものです。
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -print \;
しかし、次の場合、常にoperation not permitted
ディレクトリエラーが発生しますroot/
(正確に言えば、私は所有者でも一般ユーザーでもありません)。これはsda2
、期待どおりにクリーンアップされないことを意味します。
LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -exec cp -r '{}' /home/user/sda2/home_backup/ ;/
明らかな理由から除外する必要があり、/home/user/sda2
同じデータを繰り返しコピーしないでください。
これを確認しても実際に私の質問に対する答えではありませんが、prune
これがどのように機能するかについてのアイデアを得ることができます。
https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh/1489405#1489405
編集する
私は前の行ですべてのファイルが一緒に混在していることに気づきましたhome_backup
が、それは問題ではありません。なぜ正しく「トリム」できないのかはまだ疑問です。
ベストアンサー1
コマンドにはいくつかの問題があります。しかし、最も重要なことはcp -r
。
このコマンドは、自分を含むfind /home ... -iname '*'
すべてのファイルとディレクトリと一致することです/home
。したがって、実行され、対応するcp -r /home /home/user/sda2/home_backup/
インストールが含まれます。
これを行う合理的な方法はありませんfind
。デフォルトでは、操作に誤ったツールを使用しています。使用rsync
。-x
インストールを繰り返しコピーしないようにオプションを渡します。
rsync -aHAXx /home /home/user/sda2/home_backup
何らかの理由でこの方法がうまくいかない場合、またはrsync
本当にそうしたい場合は、find
いくつかの手順を実行してこれを行う必要があります。
最初のステップは、ディレクトリ構造を作成することです。
find /home -mount -type d -execdir mkdir -p /home/user/sda2/home_backup/{} \;
-mount
代替使用に注意してください-prune
。使用できますが、-prune
より-mount
簡単です。また、の使用に注意してください-execdir
。これは{}
絶対パスではなく相対パスで置き換えられるためです。必要に/home/user/sda2/home_backup/home/...
応じて使用できます-exec
。
その後、ファイルをコピーする必要があります
find /home -mount \! -type d -execdir cp -a {} /home/user/sda2/home_backup/{} \;
ファイルを一致させるために、ディレクトリを除くすべてを一致させます。これはシンボリックリンクやパイプなどの非ファイルをコピーします。
これを1つのfind
コマンドにまとめることができますが、そうすれば状況がより混乱するだけです。
これらすべてのニュアンスのため、rsync
これはより良い選択です。