número limite de comandos da árvore linux de arquivos exibidos em cada diretório

6

Eu quero usar tree (ou similar) para ver a estrutura de diretórios de um determinado diretório, bem como se cada subdiretório tem arquivos nele. Então, como eu poderia usar tree , mas limitar o número máximo de arquivos a serem exibidos em um determinado subdiretório?

Se isso não puder ser feito com tree , como isso pode ser feito modificando o código Python de este site ?

    
por synaptik 14.11.2014 / 17:31

2 respostas

5

Aqui está um exemplo de trabalho com o código python que você citou:

Uso: tree.py -f [file limit] <directory>

Se um número for especificado para -f [file limit], então ... <additional files> será impresso e os outros arquivos serão ignorados. Diretórios adicionais não devem ser ignorados. Se o limite do arquivo for definido como 10000 (padrão), isso funcionará como sem limite

#! /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()

Quando executado, deve produzir uma saída semelhante a:

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>
    
por 17.11.2014 / 23:04
2

Pode-se usar tree --filelimit=N para limitar o número de subdiretórios / arquivo a serem exibidos. Infelizmente, isso não abrirá o diretório que tem mais de N subdiretórios e arquivos.

Para casos simples, quando você tem vários diretórios e a maioria tem muitos arquivos (digamos, > 100), você pode usar 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

Observação , se A1 / C2 tiver um subdiretório A3, ele não será mostrado.

P.S. Esta não é uma solução completa, mas será mais rápida para alguns.

    
por 19.09.2016 / 11:46