我编写了一个脚本,该脚本删除了文件夹中除最后两个文件以外的所有文件:
#!/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?