sudoでディレクトリをコピーすると、階層の最初のレベルだけがコピーされます。

sudoでディレクトリをコピーすると、階層の最初のレベルだけがコピーされます。

この質問も聞かれましたここ

bash で sudo を使用してディレクトリ (dir) を再帰的にコピーすると、dir 階層の最初のレベルだけがコピーされますが、sudo なしで使用すると、dir とそのすべてのサブディレクトリがコピーされます。ただし、コマンドラインのコマンドでは、sudo の有無のみに違いがあります。

なぜこのようなことが起こるのでしょうか?

例えば:

k@l:/$ tree
.
|
|__a
|  |
|  |__b
|     | 
|     |__1.htm   
|
|__c
k@l:/$ sudo cp -r /a/b /c/d
k@l:/$ cd /c
k@l:/c$ ls
d
k@l:/c$ cd d
bash: cd: /c/d: Permission denied
k@l:/c$ tree
.
|__d [error opening dir]

1 directory, 0 files

答え1

これを行うと、sudo cp -r /a/b /c/dフォルダは/c/d/ルートとしてコピーされ、所有者はルートになります。許可が拒否されましたディレクトリを開くにはルート権限が必要なので、ルート ターミナルで開いてみてください。または、ファイルの所有者を変更するか、 //c/d/を使用して権限を修正して、現在のユーザーがフォルダーにアクセスできるようにする必要があります。chownchmod

注:はプログラムではなくシェル コマンドなのでsudo cd動作しません。cd

答え2

/c/d は別の所有者で権限 700 を持っていた可能性があります。 を試してくださいsudo chmod -R 755 /c/d

答え3

cp -aの代わりにを使用することをお勧めしますcp -r。後者では一部のファイル属性が保持されない可能性があります。

答え4

コマンドを変更する代わりにcpsudo特定のユーザーとして次のように実行することもできます。

sudo -u thisUser cp -r /a/b /c/d

thisUserただし、これは権限を持っている場合にのみ機能します/a/b

関連情報