我编写了一个脚本,该脚本删除了文件夹中除最后两个文件以外的所有文件:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
该脚本将每天作为cron作业执行。
理由如下:
使用获取所有文件的列表
ls -1
(这样我每行得到一个文件);使用
head -n -2
; 从列表中删除最后两个。由于
ls
打印相对路径,因此请使用xargs printf
事物在文件夹路径之前加上前缀,并使其成为绝对路径;将其发送给
sudo rm -rf
使用xargs
。
每个人都可以访问此文件夹,因此任何人都可以创建和删除此文件夹中的任何文件。
问题是: sudo rm -rf
很恐怖。xargs sudo rm -rf
非常可怕。
我想确保没有人会通过创建聪明的文件来删除(意外或故意删除)而损坏其他文件夹/系统。我不知道,像这样的聪明东西:
file with / spaces.txt
这可能会导致超级恐怖sudo rm -rf /
。
编辑:我的错误,文件名不能包含/
,因此不会发生此特定问题,但是有关是否存在其他风险的问题仍然存在。
这就是为什么我正在使用--quoting-style=shell-always
,这应该防止带有空格的文件的任何窍门。但是现在我想知道是否有人会更聪明地使用文件名中的空格和引号。
我的脚本安全吗?
注意:我需sudo
要这样做是因为我要远程访问该文件夹(使用来从映射的网络驱动器访问mount
),并且如果没有sudo我将无法使它正常工作。
/
名称中字符的文件吗?我正在尝试在此处实现这一点
ls
输出,所以即使使用引号,这也已经是一个写得不好的命令。ls
我想,我也使用语言环境来进行排序,所以我看不出head
删除后2个的目的是什么(除非您试图摆脱它,.
并且..
无论如何都不允许将哪个iirc用作参数rm
。只需使用find /path/to/folder -type f delete
。不,sudo
如果您从cron运行
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?