这是我的第一个问题,感谢您允许我提问并阅读我的问题!
我在 Ubuntu 22.04 下,使用 GNOME Shell 和 bash shell。我有一个包含 800 多个子目录的文件夹。每个子目录包含 4 到 8 个不同分辨率的同一视频版本。对于每个视频/子目录,我只想保留最佳分辨率。
如何递归删除所有子目录中的所有文件并仅保留每个子目录中最大的文件?
答案1
抱歉,我不会为您编写脚本,但这里有一个可以使用的算法。(虽然以下内容使用了脚本元素,但它远非准确的脚本,简单地尝试插入命令可能会造成灾难性的后果)
在执行任何操作之前,我强烈建议将整个目录结构复制到另一个磁盘,您可以在执行脚本之前对其进行测试,并意外删除无法恢复的文件
- 从顶级目录,
fldrLst='find ./ -type d'
(我使用单引号作为左刻度标记) - 从顶层目录开始,循环
$fldrLst
执行以下操作- 按文件大小降序排列,从单个目录叶获取文件列表:
fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'
其中[n]
是列表数组的特定成员。 - 计算目录叶中的文件数:
echo $fildLst | wc -l
- 删除第一个条目(应该是最大的文件)之后的每个文件:循环
$fileLst
并删除rm $fileList[n]
(其中第一个n
是数组中的第二个条目)。
- 按文件大小降序排列,从单个目录叶获取文件列表:
这应该可以帮助您走上完成任务的正确轨道。
如果这个答案有助于您找到解决方案,请务必将其标记为答案或将其评为部分解决方案。
答案2
测试版本,它只会列出将被删除的文件:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l
工作版本,它将删除您的文件:
find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm
原始代码来自卡米尔·马乔罗夫斯基