![如何只保留一个最大的文件并删除所有其他文件](https://linux22.com/image/170726/%E5%A6%82%E4%BD%95%E5%8F%AA%E4%BF%9D%E7%95%99%E4%B8%80%E4%B8%AA%E6%9C%80%E5%A4%A7%E7%9A%84%E6%96%87%E4%BB%B6%E5%B9%B6%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E6%96%87%E4%BB%B6.png)
同一目录下有3或4个文件,如下所示;
AAA.360p.mp4
AAA.450p.mp4
AAA.720p.mp4
AAA.1080p.mp4
这些文件的文件名除了帧分辨率的表达之外几乎相同。
(AAA 是文件名的示例。表示这些文件名除了帧分辨率之外都是相同的。)
并且 AAA 之间有几个点。
例如,文件名是这样的;
Interesting.Comedy.E10.200406.450p.mp4
Interesting.Comedy.E10.200406.720p.mp4
Interesting.Comedy.E10.200406.1080p.mp4
每个文件的大小不同
(文件大小:360p < 450p < 720p < 1080p) → 始终如此。
我想只保留一个文件,即最大的文件,并删除所有其他文件。
目录的位置是/volume1/video/
它将仅在 Synology 上运行该命令。 (使用控制面板中的任务计划程序)
如果您向我解释,请在我的案例中包含目录路径,如上所述。
(因为我无法应用您推荐给我的代码,因为我缺乏理解。我很抱歉)
答案1
下面的代码对您很有用,但是您可以创建文件的副本并首先尝试该目录。
#!/bin/bash
var=`find /volume1/video/ -printf '%s %p\n'| sort -nr | head -n 1 | awk '{ print $2 }'`
largestfilename=`echo $var | rev | cut -d"/" -f1 | rev`
for i in `ls -S /volume1/video/`
do
if [ ! $i == $largestfilename ]
then
rm -f /volume1/video/$i
fi
done
答案2
LARGEST=$(ls -S /volume1/video/* | head -1)
ls /volume1/video/* | grep -v "$LARGEST" | xargs -d '\n' rm
第一行运行一个命令来列出/volume1/video/
按大小排序的所有文件,并通过管道列出来head
识别第一个文件。该命令的输出然后存储在名为 的变量中$LARGEST
。
第二行再次列出所有文件/volume1/video/
,greps 出最大文件的名称,然后删除其余文件。
编辑:向 xargs 添加 -d 标志以考虑文件名中潜在的空格。看这个答案了解更多信息。