0

我有大量包含在测试目录中的文件。我需要为我的应用程序保留目录结构,但想精简文件以加快测试速度。我想将一个目录可以拥有的文件数限制为 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

我发现了一个关于为一个目录执行此操作的问题,但不是递归的。

4

2 回答 2

2

我会在 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 个文件之外的所有文件总是有点冒险的。买家小心...

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

于 2013-01-24T02:39:28.620 回答
0

这个相当长的序列将适用于包含空格等的文件,并且只需将前三个按字母顺序排序的文件留在每个子目录中。

编辑:应用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 版本不支持行终止符的--zeroor--null标志,因此我不得不使用tr. 欢迎提出改进建议。

于 2013-01-24T02:55:11.533 回答