如果我在路径内/parent/child1/child2
并且我想删除parent
其中的所有内容(child2
除了child1
.parent
那么谁能告诉我该命令将如何执行?
答案1
假设您使用的是bash
shell:
shopt -s dotglob extglob
rm -rf ../../!(child1)
这里的命令shopt
在 shell 中启用两个 shell 选项bash
。第一个dotglob
,确保隐藏名称将与文件名通配模式相匹配。第二个,extglob
,启用一些扩展的通配模式(最初来自ksh
shell)。
第二行使用扩展的通配模式来匹配parent
目录中除名称之外的所有名称child1
。该目录的内容parent
比我们高两级,因此我们首先使用,然后添加将匹配除名称之外的所有名称的../../
模式。!(child1)
child1
它将所有匹配的名称传递给rm -rf
(递归)删除。
../../!(child1)
您还可以使用目录的绝对路径,而不是在模式中使用相对路径parent
。根据你的问题,绝对路径是/parent
,所以模式就变成了/parent/!(child1)
。如果您不确定相对于parent
目录的实际位置,使用绝对路径可能更安全。
解决此问题的另一个明显方法是child1
首先将目录移开,删除并重新创建parent
目录,然后child1
再次将目录移到位。
在这里,我使用绝对路径名(使用相对路径名会令人困惑,因为我们相对于 移动当前目录parent
):
mv /parent/child1 /tmp
rm -rf /parent
mkdir /parent
mv /tmp/child1 /parent
答案2
如果你有GNU find,你可以使用这个命令
find ../.. -depth -not -path "../../child1/*" -not -samefile ../.. -not -samefile ../../child1 -exec rm -r {} \;
只要确保您确实在里面/parent/child1/child2