Linux bash脚本,用于在满足条件的情况下查找和删除目录树中包含特殊字符和空格的最旧文件

时间:2016-12-06 00:15:35

标签: linux bash

我需要一些帮助来构建一个linux bash脚本来查找和删除目录树中包含特殊字符和空格的最旧文件(如果符合条件)。

我一直在论坛上搜索这样的问题,感谢这里的用户,我带有输出,如下所示。到目前为止,我无法弄清楚如何将输出文件管道输出到rm,以便将其删除。

目标是检查hdd是否正在运行,如果是,则删除最旧的文件,直到满足可用空间要求。问题是,文件名中填充了特殊字符和空格......

这就是我最终的结果(感谢用户!):

find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort | head -q -n 1 | cat

提供输出:

2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/some folder (R)/some filename (R)2016-03-1119-00.ts

如何获取文件的完整路径名,并将所有特殊的字符和空格用管道传输给rm,以便删除文件?

以下是回答帖子的输出:

root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d |  head -n1
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts
root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d |  head -n1 | xargs -I{} echo rm -f "{}"
rm -f 2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts
root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d |  head -n1 | xargs -I{} rm -f "{}"
root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\n' | sort -d |  head -n1
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/VIDEO_FILE (R)/VIDEO_FILE (R)2016-03-1119-00.ts

编辑:来自已接来邮件的输出1。仍然没有工作......

EDIT2:来自sorontar建议的输出,仍然无效,新建议只给出了dir名称,而不是文件...

新输出:

root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2
/mnt/volume0/recordings/Parneviks
root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2 | xargs -0 -I{} echo rm -f "{}"
rm -f /mnt/volume0/recordings/Parneviks

虽然最旧的文件是:

root@SERVER:~# find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z
2016-03-11+19:21:44.2814042100 /mnt/volume0/recordings/Parneviks (R)/Parneviks (R)2016-03-1119-00.ts

有什么建议吗?

EDIT3: -f2-而不是-f2使它工作。谢谢大家!

正确的行是:

find /mnt/volume0/recordings/ -type f -printf '%T+ %p\0' | sort -zk1,1 | head -n1 -z | cut -zd ' ' -f2- | xargs -0 -I{} rm -f "{}"

1 个答案:

答案 0 :(得分:3)

如果您真的想要处理包含空格,换行符和任何特殊字符的文件,则必须考虑使用null \0作为文件名的限制,如下所示:

dir=/mnt/volume0/recordings

find "$dir"/ -type f -printf '%T+ %p\0' | 
    sort -zk1,1 | 
    head -n1 -z |
    cut -zd ' ' -f2- |
    xargs -0 echo rm -f --

这将在目录中找到文件并强制删除最旧的文件(只有一个)(如果删除了回声,请在实际使用之前对其进行测试)。