ディレクトリを削除し、同じ名前と権限を持つ新しいディレクトリを作成する

ディレクトリを削除し、同じ名前と権限を持つ新しいディレクトリを作成する

ディレクトリとその内容を繰り返し削除してから、同じ名前と権限で再作成したいと思います。ディレクトリは削除される前に私が作成または所有していたかもしれませんが、そうではなかったかもしれませんが、Rootによって作成されたフォルダに触れるのではなく、私と同じレベルのユーザーが作成/所有するフォルダだけに触れると確信しています。

ディレクトリとその内容の両方を再帰的に削除するコマンドがあります。

rm -rf path/to/somefolder 2> /dev/null
## OR ##
rm -rf /some/path/.* 2> /dev/null && rm -rf /some/path 2> /dev/null

しかし、削除する前に権限を取得し、新しく作成されたディレクトリに再適用するにはどうすればよいですか?

答え1

使いやすいmtree

a/現在のディレクトリをルートにするパスが与えられた場合:

235158  1 drwx------    3 jim     wheel   4 Apr  1 08:08 .
235199  1 drwxr-xr-x    3 jim     wheel   3 Apr  1 08:05 ./a
234526  1 drwxr-xr-x    3 jim     wheel   3 Apr  1 08:05 ./a/b
234527  1 drwxrwxr-x    3 jim     wheel   3 Apr  1 08:05 ./a/b/c
234528  1 drwx------    2 jim     wheel   2 Apr  1 08:05 ./a/b/c/d

Create Hierarchy仕様を使用して始めますmtree-dディレクトリのみが処理されることを示し、-c仕様を生成して標準出力に書き込むフラグで、-p amtreeに階層のルートディレクトリを知らせます。

$ mtree -dcp a > a.mtree

次に、階層を削除しaて空のディレクトリを再作成しますa

$ rm -rf a
$ mkdir a

最後に、以下のディレクトリ階層を再入力し、生成された初期a仕様で文書化された値にすべての権限を設定しますmtree。ここではフラグを省略します。-cなぜなら、私たちはそうではないからです。作る仕様は標準入力から読み取られ、ディスクの実際の階層と比較されます。 -t階層内のタイムスタンプを仕様の値に設定するために追加されました。

$ mtree -utp a < a.mtree 
.:      modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b:      modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b/c:    modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b/c/d:  modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
$ find a -ls
235555  1 drwxr-xr-x   3 jim     wheel    3 Apr  1 08:05 a
194841  1 drwxr-xr-x   3 jim     wheel    3 Apr  1 08:05 a/b
194842  1 drwxrwxr-x   3 jim     wheel    3 Apr  1 08:05 a/b/c
194843  1 drwx------   2 jim     wheel    2 Apr  1 08:05 a/b/c/d

書き込みアクセス権があるがa/ルートの親ディレクトリがない場合は、代わりに下にディレクトリを作成a/できます。それ以外の場合は、同様の方法で続行してください。a.mtree/tmp

$ mtree -dcp a > /tmp/a.mtree
$ rm -rf a
rm: a: Permission denied

エラーメッセージにもかかわらず、それa/自体を除くすべてが消えた。

$ find a
a

したがって、書き込み権限がない場合は続行をa/..スキップできますmkdir a

$ mtree -utp a < /tmp/a.mtree 
.:      modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b:      modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b/c:    modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)
b/c/d:  modification time (Mon Apr  1 08:05:24 2024, Mon Apr  1 08:11:33 2024, modified)

答え2

ディレクトリを削除して再作成するのではなく、内容を削除して現在空のディレクトリを残すことをお勧めします。これは、親ディレクトリに書き込めない場合に機能する利点があります。

または、新しいディレクトリを作成します。今後chmod --reference=たとえば、coreutilsなどを使用して権限(およびタイムスタンプまで)をコピーできるように、古いエントリを削除します。古いディレクトリを削除した後、新しいディレクトリの名前を変更するために使用されますmv(または新しいディレクトリを作成する前に古いディレクトリの名前を変更します)。

関連情報