我想制作一个 bash 脚本来删除文件夹中的旧文件。每次运行脚本时,只会删除一个文件,即较旧的文件。你能帮我解决这个问题吗?谢谢
答案1
正如科斯指出的那样,可能无法知道最旧的文件(根据创建日期)。
如果修改时间适合您,并且文件名没有新行:
rm -- "$(ls -rt | head -n 1)"
(如果您无法控制文件名小心解析 ls 输出)
添加是否也考虑隐藏文件的-A
选项。ls
从 GNU coreutils 9.0 开始,GNUls
现在可以--zero
选择列出以 NUL 分隔的文件名,因此使用这些最新版本和 bash 或 zsh 作为 shell,可以使用任何文件名的版本将是:
IFS= read -rd '' file < <(ls --zero -rt) &&
rm -- "$file"
这些较新的版本还具有--time=birth
可以在某些系统和文件系统上按诞生时间排序的功能(包括大多数本机文件系统上的最新 GNU/Linux 系统)。
答案2
看起来您可以删除最旧的修改文件而不是最旧创建的文件;
无论 、stat
和实用程序的 GNU 实现可用,我认为这是最安全的方法,因为它不会在包含换行符的文件名上中断:sort
sed
xargs
stat --printf='%Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
stat --printf='%.Y %n\0' ./*
:打印最后一次修改时间的 NUL 分隔列表(尽可能精确),后跟当前工作目录中每个非隐藏文件的文件路径,前缀为 以./
避免以-
(开头的文件名--
出现问题适用于 GNUstat
,其中调用的文件-
仍会被解释为含义标准输入);sort -zn
n
:使用 NUL 作为行分隔符对列表进行数字排序;sed -z 's/[^ ]\{1,\} //;q'
:从第一个以 NUL 结尾的行中删除第一次出现的包含除空格之外的一个或多个字符的字符串,并q
在处理和打印第一行后删除它;xargs -r0 rm
rm
:仅当存在这样的行时,才将 NUL 终止行作为参数传递给;
% touch file1
% touch file2
% stat -c '%.Y %n' ./*
1447318965.123211222 ./file1
1447318965.784234234 ./file2
% stat --printf='%.Y %n\0' ./* | sort -zn | sed -z 's/[^ ]\{1,\} //;q' | xargs -r0 rm
% ls
file2
答案3
根据“访问时间”或“修改时间”确定最旧的文件?
如果是第二个,则只需使用以下命令:
rm ls -l --sort=time | sed -n 2p | awk '{print $NF}'
答案4
在 中zsh
,无论文件名可能包含什么字符或非字符,都可以工作:
rm -- *(Om[1])
其中Om
O
按上次修改时间反向排序m
(从最旧到最新,如 for ls -rt
),并将[1]
扩展限制为第一个匹配项。
或者:
rm -- *(-Om[1])
考虑符号链接解析后的修改时间(如使用-L
选项ls
)。
rm -- *(Om[1]^/)
排除类型的文件目录(无论如何都rm
无法删除-r
),-
如果您希望在符号链接解析后考虑该类型和年龄,则再次使用前缀。另请参阅D
限定符来考虑隐藏文件,.
或者常规的仅文件。
在bash
或任何其他 shell 中,只需使用zsh -c 'those codes above'
.