使用 find 从 rsnapshot 树中选择性删除的替代方法?

使用 find 从 rsnapshot 树中选择性删除的替代方法?

我正在寻找这个问题的通用解决方案,因为我确信它会再次出现。

我有一个做医学研究的客户。我们必须定期删除当地卫生当局提供的数据集,并证明我们已经安全地这样做了。

我们使用 rsnapshot 并保留

7 dailies, 
4 weeklies, 
12 monthlies, 
4 yearlies.

我最近需要清除 rsnapshot 树中多年历史的数据,这些数据在源位置中看起来很像这样:

/path/to/studyName/data files yyyy mm 01/bunchOfFiles
/path/to/studyName/data files yyyy mm 02/bunchOfFiles
/path/to/studyName/data files yyyy mm 03/bunchOfFiles
/path/to/studyName/randomly placed and named data file 1
/path/to/studyName/randomly named admin file to keep 1
/path/to/studyName/randomly placed and named data file 2
/path/to/studyName/randomly placed and named data file 3
/path/to/studyName/randomly named admin file to keep 2
/path/to/studyName/randomly named admin file to keep 3
/path/to/studyName/randomly placed and named data file 4
/path/to/studyName/randomly named admin file to keep n
/path/to/studyName/randomly placed and named data file 5

请注意,./data files* 子目录也出现在许多其他研究位置,因此它们不能用作查找目标。

我想做的将涉及 find 和几个嵌套的 -exec 命令。但 find 不能这样做。

我尝试在第一个 -exec 命令中使用 bash -c 嵌套 -exec 。在我处理了各种需要处理的事情(例如子目录名称中的空格)之后,我的计时器耗尽了,而制作一个巨大的 rm 命令集合来删除文件的每个实例变得更具成本效益(或包含数据文件的子目录)。

例如,如果可以嵌套 -execs,我认为这会起作用:

find /path/to/rsnapshot_tree -type d -name studyName / 
  -exec 'find {}  -type d -iname "data files* -exec rm -rf {} \;'

好的 - 由于 -exec 终止和 {} 的不明确性,它无法工作,但将其视为伪代码

本质上,

  • 在 rshapshot 树中找到目录“studyName”的每个实例,然后将 rm -rf 应用于“data files*”描述的 3 个目录
  • 然后对 StudyName 目录中每个放错位置的数据文件实例重复此操作

我必须在脚本中复制、粘贴、编辑并正确使用 6 个命令,而不是 >150 个命令。

任何有关更好方法的建议将不胜感激。

我在 linux (debian/ubuntu) 和 freeBSD 主机上托管了 rsnapshot 树。 Bash 始终是 shell(我更改了 freeBSD 主机上的默认设置)

答案1

我对你的问题并不完全清楚,但如果你有一个如下的目录结构——

a
a/data
a/data/file1
a/studyName
a/studyName/data
a/studyName/data/file1
a/studyName/data/file2
a/studyName/data/file3

如果你正在寻找 StudyName/data/fileX,你可以这样做——

find  . -path "*studyName/data*" -type f
./a/studyName/data/file1
./a/studyName/data/file2
./a/studyName/data/file3

相关内容