递归删除每个目录中除特定号码以外的所有文件

时间:2013-01-24 02:20:00

标签: linux bash gnu

我在测试目录中包含大量文件。我需要为我的应用程序保留目录结构,但希望将文件稀疏以便更快地进行测试。我想限制一个目录可以拥有的文件数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

我找到了a smiliar question about doing this for one directory, but not recursively

2 个答案:

答案 0 :(得分: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个文件以外的所有文件总是有点冒险。买家要小心......

顺便说一句,我自己没有测试过。只需输入想到的内容。您可能需要稍微调整一下才能使其正常工作。买家要小心。

答案 1 :(得分: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版本不支持行终止符的--zero--null标记,因此我必须使用tr解决该问题。欢迎提出改进建议。