【问题标题】:Linux bash script to find and delete oldest file with special characters and whitespaces in a directory tree if condtion is met如果满足条件,Linux bash 脚本可在目录树中查找和删除具有特殊字符和空格的最旧文件
【发布时间】:2016-12-07 09:29:56
【问题描述】:

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

我一直在论坛中搜索此类问题,感谢这里的用户,我提供了如下所示的输出。到目前为止,我无法弄清楚如何将输出文件名通过管道传输到 rm,以便将其删除。

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

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

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

编辑:来自 anwered post1 的输出。还是不行……

EDIT2:来自 sorontar 建议的输出,仍然无法正常工作,新建议仅给出目录名称,而不是文件...

新输出:

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

有什么建议吗?

编辑3: -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 "{}"

【问题讨论】:

  • 很高兴您的问题得到了解决!也就是说,对于未来,答案不应该被编辑成问题——将问题和答案分开意味着社区可以根据各自的优点为每个问题投票。 (虽然您在这里有一个好的答案,但如果您没有有任何好的答案,最好添加您自己的答案作为答案而不是将其编辑为问题)。
  • (同样,由于我们实际上为那些关心的人提供了一个具有完整差异风格编辑历史的界面,因此本地偏好是编写和编辑问题和答案,以便尽可能清楚地阅读'以前没见过它们,而不是在最后调用了编辑)。
  • 好的,抱歉。这是我的第一篇文章。我只是想弄清楚是什么解决了这个问题。我会牢记这一点,以备将来之用。再次非常感谢所有贡献者。
  • 完全没有问题——每个地方都有自己的文化和期望,虽然the help center 中记录了很多期望,但很多事情的共识只是在meta如果即使在那里。欢迎使用 StackOverflow ——我希望它在很长一段时间内对你有用!

标签: linux bash


【解决方案1】:

如果您确实想处理带有空格、换行符和任何特殊字符的文件,则必须考虑使用 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 --

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

【讨论】:

  • 感谢您的意见!我将使用空运算符。请参阅编辑,以获取输出,不幸的是,您的建议仅输出文件的目录名称。文件会在目录树的子文件夹中,不知道是不是这个问题?
  • 如果文件名中有空格,cut -f2 将不起作用。也许您的意思是-f2- 而不是-f2
  • (我建议不要在不必要的时候使用-I{},不过——xargs -0 rm -f -- 将使用更少的rm 调用来完成这项工作,并将避免xargs -I 带来的所有遗留限制它)。
  • @sorontar,我希望我不会因为编辑代码而过分——如果不受欢迎,请随时支持更改并提出替代解决方案。
  • @CharlesDuffy 完全没有,如果您发现它有用,请随时更新(以及未来的答案)。如果需要,总有机会进行更多编辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2011-04-06
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
相关资源
最近更新 更多