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