我正在寻找这个问题的通用解决方案,因为我确信它会再次出现。
我有一个做医学研究的客户。我们必须定期删除当地卫生当局提供的数据集,并证明我们已经安全地这样做了。
我们使用 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