Bash 根据文件大小变化移动文件夹的脚本?

Bash script to move folders based on filesize changes?

我在专有 linux 发行版中有一些自动下载。 他们转到临时暂存盘。我想在完成后将它们移动到主 RAID 阵列。我能看到的最好的方法是检查磁盘上的文件夹,看看内容是否在最后一分钟发生了变化。如果没有那么它可能已经完成下载然后移动它。

假设此位置可能有数百个文件夹或只有一个文件夹,并且所有文件夹都指向同一个位置。最好的写法是什么?

我可以通过

获取文件夹大小列表
du -h directory/name

文件夹可以包含多个文件,大小从 1.5mb 到 10GB

Temp Loc:  /volume2/4TBScratch/Processing
Dest Loc when complete: /volume1/S/00 Landing

编辑: 使用这个:

find  /volume2/4TBScratch/Processing -mindepth 1 -type d -not -mmin +10 -exec mv "{}"  "/volume1/S/00 Landing" \;
find: `/volume2/4TBScratch/Processing/test': No such file or directory
4.3#

但它确实复制了相关文件夹和所有文件。但是这个错误让我担心将来可能会出现问题......是因为有多个文件并且它是 运行 根文件夹中每个文件或文件夹的相同移动命令吗?但是因为它在第一次迭代中移动了所有内容,所以在下一次迭代中找不到它?

编辑2: 使用 Rsync

4.3# find  /volume2/4TBScratch/Processing -mindepth 1 -type d -not -mmin +10 -exec rsync --remove-source-files "{}" "/volume1/S/00 Landing" \;
skipping directory newtest
skipping directory erw

已解决:EDIT3 在下面评论的帮助下解决了。最终脚本如下所示:

find  /volume2/4TBScratch/Processing -mindepth 1 -type d -not -mmin +10 -exec rsync -a --remove-source-files "{}" "/volume1/S/00 Landing" \;
find /volume2/4TBScratch/Processing -depth -type d -empty -delete

rsync 移动文件夹和文件但留下空的根目录 下一个命令找到空文件夹并将其删除。

谢谢大家!

您可以使用 GNU find 和选项 -size 来检测特定大小的 files/folders 并使用 mv-exec 选项移动到目标目录。语法是

find /volume2/4TBScratch/Processing -type d -maxdepth 1 -size -10G -exec mv "{}"  "/volume1/S/00 Landing" \;

使用rsync

find /volume2/4TBScratch/Processing -type d -maxdepth 1 -size -10G -exec rsync --remove-source-files "{}" "/volume1/S/00 Landing" \;

带有 - 符号的尺码表示小于上述尺码,在本例中为 10GB。关于每个使用的标志的注释

  • -type d -> 仅识别源路径中的文件夹。
  • -maxdepth 1 -> 只查看当前源目录而不查看 正在递归。
  • -exec -> 执行命令。

或者,如果您想查找在特定时间(分钟)内最后一次修改的文件,find 有一个 -mmin 选项,可以设置一个值。例如。 -mmin -5 会在五分钟前修改 return 个文件。

因此建议将其添加到您的要求中,对于 x 根据需要查看目录是否已列出,然后您可以添加 -exec 选项以移动目录

find /volume2/4TBScratch/Processing -type d -maxdepth 1 -mmin -2 -size -10G

请参阅 GNU 文档以了解 finding files according to size 其工作原理。

注意:- 添加双引号 ("") 是为了避免 Bash 拆分包含空格的名称。