删除Parent中除一个之外的所有文件

删除Parent中除一个之外的所有文件

如果我在路径内/parent/child1/child2并且我想删除parent其中的所有内容(child2除了child1.parent那么谁能告诉我该命令将如何执行?

答案1

假设您使用的是bashshell:

shopt -s dotglob extglob
rm -rf ../../!(child1)

这里的命令shopt在 shell 中启用两个 shell 选项bash。第一个dotglob,确保隐藏名称将与文件名通配模式相匹配。第二个,extglob,启用一些扩展的通配模式(最初来自kshshell)。

第二行使用扩展的通配模式来匹配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

相关内容