繁体   English   中英

递归删除所有文件,每个目录中除特定数目的文件

[英]Recursively delete all files except a certain number in each directory

我在目录中包含大量文件进行测试。 我需要为应用程序保留目录结构,但想对文件进行精简以进行更快的测试。 我想将目录的文件数限制为3。如何在Linux中做到这一点?

为了阐明我要完成的工作,请使用Python解决方案:

import sys, os
for root, dirs, files in os.walk(sys.argv[1]):
    for index, file in enumerate(files):
        if index > int(sys.argv[2]) - 1: os.remove(os.path.join(root, file))

用法:

python thinout.py /path/to/thin\ out/ <maximum_number_of_files_per_directory>

例:

python thinout.py testing\ data 3

我找到了一个针对一个目录执行此操作的小问题,但不是递归地进行

我会在bash中执行以下操作:

for dir in `find . -type d`; pushd $dir; rm `ls | awk 'NR>3'`; popd; done;

或者此版本可能更好:

for dir in `find . -type d`; pushd $dir; rm `find . -maxdepth 1 -type f | tail -n +3`; popd; done;

当然-仅随机删除目录中除前3个文件之外的所有文件总是有些冒险。 买家当心...

顺便说一句,我自己没有对此进行测试。 只需输入想到的内容即可。 您可能需要对其进行一些微调才能使其正常工作。 再次,买家要当心。

这个相当冗长的序列将处理包含空格等的文件,并将前三个按字母顺序排序的文件保留在每个子目录中。

编辑:应用mklement的改进来处理需要转义的目录。

find /var/testfiles/ -type d -print0 | while IFS= read -r -d '' subdir; \
do cd "$subdir"; find . -mindepth 1 -maxdepth 1 -type f -print0 | \
sort --zero-terminated | tr '\0' '\n' | tail -n+4 | tr '\n' '\0' | \
xargs --null --no-run-if-empty rm ; cd "$OLDPWD" ; done

由于我的tail版本不支持行终止符使用--zero--null标志,因此我必须使用tr解决该问题。 欢迎提出改进建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM