使用shell命令执行以下操作的最简单方法是什么?
伪代码:rm abc if >100MB else mv abc /tmp
abc可以是一个文件或一个目录的名称。
我想要一个别名,如果在文件或目录上运行,则将其删除(如果其大小大于100MB),否则将其移至另一个目录。 我知道我可以用一个完整的功能完成类似的事情,但是必须有一个光滑的单线可以做到这一点。
答案 0 :(得分:5)
要移动单个常规文件(如果其大小小于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/
要根据输入参数是指向文件还是指向目录来执行一项或多项操作,请使用[ -d "$path" ] && <directory pipeline> || <file pipeline>
(或者最好是因为这开始是很多代码,因此使用标准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
。
答案 1 :(得分:-1)
这可以通过组合find命令和xargs / rm语句以及rsync以及在脚本中执行此命令的顺序来实现。
例如:
find /foo/bar -type f -size +100M -print | xargs rm
通过xargs的管道是为了提高效率,因此不会对find找到的每个文件执行rm命令。
然后接下来是一个rsync语句,以镜像其余文件的层次结构(从您的问题来看,不是100%清楚我是否存在其他文件的子目录,因此我建议使用rsync,它也将涵盖subdir hirarchie)不同的路径并使用rsync命令行选项
rsync -av --remove source files /foo/bar /tmp
结论:以正确的顺序进行find / rsync的组合比使用“ find .. -exec”提出的其他解决方案效率更高,在其他解决方案中,“ find .. -exec”的执行频率与找到文件的次数一样。更为高级的Unix Admins避免“ find ... -exec”不浪费宝贵的系统资源,因为它在拥有大量文件时可以更好地扩展。
答案 2 :(得分:-1)
我会使用两个命令(未经测试)来代替IF子句:
find ./ -size +100M -delete
find ./ -size -100M -exec mv {} /somewhere \;
这两个命令都可以使用分号在单行代码中使用,例如以下示例:
echo once;echo twice