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

1つのディレクトリに対してこれを行うことについてのちょっとした質問を見つけましたが、再帰的ではありません。

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

この非常に長いシーケンスは、スペースなどを含むファイルで機能し、アルファベット順にソートされた最初の 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

--zero私のバージョンの tail は、行末記号のまたはフラグをサポートしていないため、 でそれ--nullを回避する必要がありましたtr。改善のための提案は大歓迎です。

于 2013-01-24T02:55:11.533 に答える