我的顶级目录是data
. data
包括几个目录,这些目录有子目录。我需要删除data/
除某些目录中的几个文件之外的所有文件和目录。
例如,数据包括目录100
和101
. 我只想保留a.txt
和b.txt
中的文件100/
和文件,同时删除和中的所有其他文件c.txt
和目录。d.txt
101/
100
101
例子:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
我使用rm -rf !(a.txt|b.txt)
命令,但我不能自动将此命令应用于每个目录。
正如您已经发现的那样,您可以使用以下
extglob
启用的功能:这允许排除匹配项,以便您可以执行以下操作:
最好
echo
先对其进行测试。此示例将匹配内部100/
不是或的任何内容以及内部不是a.txt
或的任何b.txt
内容。如果同样的规则也适用,你可以这样做:101/
c.txt
d.txt
100/
102/
你可以用
find
这个。find
您可以用-not
或否定测试!
。这将排除匹配项,而不是找到它们。您应该注意不要删除要保留的文件的任何父目录,尤其是当前目录
.
,因此请确保在删除之前彻底阅读输出。根据您的示例,您可以从
data
目录中执行类似的操作。! -path ./path/to/dir
为您想要避免删除的任何路径添加一个。您可以使用元字符,如*
,但如果您这样做,请确保引用表达式,例如"./path*dir"
,以防止任何不需要的扩展。find
默认情况下是递归的。即使我们在./100
这里没有找到,我们也会找到它的所有内容,除非它们与模式匹配[ab].txt
。如果您无法匹配要保留的所有名称,请添加另一个测试:这不会找到
a.txt
orb.txt
或foo
,但它会找到所有其他文件。当你确定你看到了你想要的,你可以添加
-delete
到最后删除找到的文件: