删除文件时排除某些文件和目录


11

我的顶级目录是datadata包括几个目录,这些目录具有子目录。我需要删除data/除某些目录中的几个文件之外的所有文件和目录。

例如,数据包括目录100101。我只是想保持a.txtb.txt在文件100/c.txtd.txt文件101/同时去除所有其他文件和目录100101

例:

.
├── 100
   ├── a.txt
   ├── b.txt
   ├── c.txt
   └── d.txt
└── 101
    ├── a.txt
    ├── b.txt
    ├── c.txt
    └── d.txt

我使用rm -rf !(a.txt|b.txt)命令,但无法自动将此命令应用于每个目录。

Answers:


12

如您所知,您可以使用extglob已启用的功能:

shopt -s extglob

这样可以排除匹配项,以便您可以执行以下操作:

rm 100/!([ab].txt) 101/!([cd].txt)

首先进行测试是一个好主意echo。此示例将匹配100/not a.txtb.txt内部的任何内容101/以及not c.txt或内部的任何内容d.txt。如果同样100/适用同样的规则,则102/可以执行例如:

10[02]/!([ab].txt) # or
{100,102}/!([ab].txt)

我仅给出了100和101目录的示例,但实际上子目录的数量接近20。是否可以在不将每个目录名写入主文件夹的情况下为每个目录实现上述代码?
deepblue

@deepblue请在您的问题中提供一个确切的示例(编辑),尤其是不清楚rm,如果您不想指定该如何知道应该将哪些文件保留在哪个目录中。
甜点

7

您可以find为此使用。您可以find使用-not或取消测试!。这将排除匹配项,而不是找到它们。

您应注意不要删除要保留的文件的任何父目录,尤其是当前目录 .,因此请确保在删除之前仔细阅读输出。

根据您的示例,您可以从data目录中执行类似的操作。

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt"

! -path ./path/to/dir为您要避免删除的任何路径添加一个。您可以使用像这样的元字符*,但是请确保使用引号括起来,例如"./path*dir",以防止任何不必要的扩展。

find默认情况下是递归的。即使我们./100在这里找不到,我们也会找到它的所有内容,除非它们与pattern匹配[ab].txt。如果无法匹配您要保留的所有名称,请添加另一个测试:

! -path "./100/[ab].txt" ! -path ./100/foo

找不到a.txtb.txtfoo,但是它将找到所有其他文件。

当确定您要查看的内容时,可以添加-delete到末尾以删除找到的文件:

find ! -path . ! -path ./100 ! -path ./101 ! -path "./100/[ab].txt" ! -path "./101/[cd].txt" -delete
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.