在shell中,如果文件大于100MB,如何删除文件,否则移动



使用 shell 命令执行以下操作的最简单方法是什么?

伪代码:rm abc if >100MB else mv abc /tmp

abc 可以是 ONE 文件的名称,也可以是一个目录的名称。

我想要一个别名,如果在文件或目录上运行,如果它的大小大于 100MB,它会将其删除,如果不是,它会将其移动到另一个目录。 我知道我可以用整个功能完成类似的事情,但必须有一个光滑的单行词可以做同样的事情。

要在单个常规文件的大小小于 100MB 时移动该文件并将其删除,可以使用以下命令:

# 104857600 = 1024 * 1024 * 100 = 100M
[ $(stat --printf '%s' "$file") -gt 104857600 ] && rm "$file" || mv "$file" /tmp/

要移动单个目录及其内容(如果其组合大小小于 100MB)并将其删除,可以使用以下命令:

[ $(du -s "$directory" | cut -f1) -gt 104857600  ] && rm -rf "$directory" || mv "$directory" /tmp/

要根据输入参数是指向文件还是目录执行其中一项操作,可以使用if [ -d "$path" ]; then <directory pipeline>; else <file pipeline>; fi

要根据大小递归移动或删除目录的所有文件,您可以使用以下内容:

find . -type f -a ( -size +100M -exec rm {} + -o -exec mv -t /tmp/ {} + )

它首先选择当前目录中的文件,然后对大小大于 100M 的文件列表执行rm ...,并与其余文件mv ... /tmp

这可以通过 find 命令和 xargs/rm 语句和 rsync 的组合以及在脚本中执行此操作的顺序来实现。

比如:

find /foo/bar -type f -size +100M -print | xargs rm

其中通过 xargs 的管道是为了提高效率,因此不会对 find 找到的每个文件执行 rm 命令。

接下来是一个 rsync 语句来镜像剩余文件的层次结构(从您的问题来看,我不是 100% 清楚是否有其他文件的子目录,因此我建议 rsync 这也将涵盖子目录 hirarchie)到不同的路径并使用 rsync 命令行选项

-
  • -删除源文件
rsync -av --remove source files /foo/bar /tmp

结论:与其他具有"查找..-exec",其中执行的程序将在找到文件时分叉。更高级的Unix管理员避免"查找... -exec",以免浪费宝贵的系统资源,并且因为它在拥有大量文件时可以更好地扩展。

最新更新