删除目录并创建具有相同名称和权限的新目录

删除目录并创建具有相同名称和权限的新目录

我想递归删除一个目录及其内容,然后使用相同的名称和权限重新创建它。在删除之前,该目录可能是我创建或拥有的,也可能不是,但我确信我不会触及 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

首先使用创建层次结构规范mtree-d表示仅处理目录,-c是创建规范并将其写入标准输出的标志,并-p a告诉 mtree 层次结构的根目录:

$ 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

不要删除目录并重新创建它,而是考虑仅删除内容并保留现在为空的目录。当您无法写入父目录时,这具有工作的优点。

或者,创建新目录删除旧的,这样您就可以复制权限(甚至可能是时间戳),例如使用 coreutilschmod --reference=等。用于mv在删除旧目录后更改新目录的名称(或在创建新目录之前更改旧目录的名称)。

相关内容