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 拆分包含空格的名称。
我在专有 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 拆分包含空格的名称。