web-dev-qa-db-ja.com

linuxtreeコマンドは各ディレクトリに表示されるファイルの数を制限します

tree(または同様のもの)を使用して、特定のディレクトリのディレクトリ構造と、各サブディレクトリにファイルがあるかどうかを確認したいと思います。では、どうすればtreeを使用できますが、特定のサブディレクトリに表示するファイルの最大数を制限できますか?

treeで実行できない場合、Pythonコードを このサイト から変更することでどのように実行できますか?

8
synaptik

これはあなたが引用したpythonコードの実例です:

使用法: tree.py -f [file limit] <directory>

-f [ファイル制限]に数値が指定されている場合、... <additional files>が出力され、他のファイルはスキップされます。ただし、追加のディレクトリはスキップしないでください。ファイル制限が10000(デフォルト)に設定されている場合、これは制限なしとして機能します

#! /usr/bin/env python
# tree.py
#
# Written by Doug Dahms
# modified by glallen @ StackExchange
#
# Prints the tree structure for the path specified on the command line

from os import listdir, sep
from os.path import abspath, basename, isdir
from sys import argv

def tree(dir, padding, print_files=False, limit=10000):
    print padding[:-1] + '+-' + basename(abspath(dir)) + '/'
    padding = padding + ' '
    limit = int(limit)
    files = []
    if print_files:
        files = listdir(dir)
    else:
        files = [x for x in listdir(dir) if isdir(dir + sep + x)]
    count = 0
    for file in files:
        count += 1
        path = dir + sep + file
        if isdir(path):
            print padding + '|'
            if count == len(files):
                tree(path, padding + ' ', print_files, limit)
            else:
                tree(path, padding + '|', print_files, limit)
        else:
            if limit == 10000:
                print padding + '|'
                print padding + '+-' + file
                continue
            Elif limit == 0:
                print padding + '|'
                print padding + '+-' + '... <additional files>'
                limit -= 1
            Elif limit <= 0:
                continue
            else:
                print padding + '|'
                print padding + '+-' + file
                limit -= 1

def usage():
    return '''Usage: %s [-f] [file-listing-limit(int)] <PATH>
Print tree structure of path specified.
Options:
-f          Print files as well as directories
-f [limit]  Print files as well as directories up to number limit
PATH        Path to process''' % basename(argv[0])

def main():
    if len(argv) == 1:
        print usage()
    Elif len(argv) == 2:
        # print just directories
        path = argv[1]
        if isdir(path):
            tree(path, ' ')
        else:
            print 'ERROR: \'' + path + '\' is not a directory'
    Elif len(argv) == 3 and argv[1] == '-f':
        # print directories and files
        path = argv[2]
        if isdir(path):
            tree(path, ' ', True)
        else:
            print 'ERROR: \'' + path + '\' is not a directory'
    Elif len(argv) == 4 and argv[1] == '-f':
        # print directories and files up to max
        path = argv[3]
        if isdir(path):
            tree(path, ' ', True, argv[2])
        else:
            print 'ERROR: \'' + path + '\' is not a directory'
    else:
        print usage()

if __name__ == '__main__':
    main()

実行すると、次のような出力が生成されます。

user@Host /usr/share/doc $ python /tmp/recipe-217212-1.py -f 2 . | head -n 40
+-doc/
  |
  +-libgnuradio-fft3.7.2.1/
  | |
  | +-copyright
  | |
  | +-changelog.Debian.gz
  |
  +-libqt4-script/
  | |
  | +-LGPL_EXCEPTION.txt
  | |
  | +-copyright
  | |
  | +-... <additional files>
  |
  +-xscreensaver-gl/
  | |
  | +-copyright
  | |
  | +-changelog.Debian.gz
  | |
  | +-... <additional files>
5
glallen

tree --filelimit=Nを使用して、表示するサブディレクトリ/ファイルの数を制限できます。残念ながら、これではN個を超えるサブディレクトリとファイルがあるディレクトリは開きません。

単純なケースでは、複数のディレクトリがあり、ほとんどのファイルが多すぎる(たとえば、> 100)場合は、tree --filelimit=100を使用できます。

.
├── A1
│   ├── A2
│   ├── B2
│   ├── C2 [369 entries exceeds filelimit, not opening dir]
│   └── D2 [3976 entries exceeds filelimit, not opening dir]
├── B1
│   └── A2
│       ├── A3.jpeg
│       └── B3.png
└── C1.sh

、A1/C2にサブディレクトリA3がある場合、表示されません。

P.S。これは完全な解決策ではありませんが、少数の人にとってはより速くなります。

3
saurabheights