11

I have the following directory structure:

bocoup_data/
├── text_reuse
│   └── v2
│       └── json
│           ├── alignments
│           └── texts
└── topic_modelling
    └── v2
        └── json

I'd like to be able to show a subset of the files in those directories, because some of the directories pictured above have thousands of files. Is there a way to show only the first n files from each directory when calling the tree command in Ubuntu?

0

3 Answers 3

6

tree as such does not have any options for this, but you can prevent it from printing files for directories with more than n entries:

$ tree /usr --filelimit 10
/usr
├── bin [3260 entries exceeds filelimit, not opening dir]
├── include [1110 entries exceeds filelimit, not opening dir]
├── lib [3700 entries exceeds filelimit, not opening dir]
├── lib32 [610 entries exceeds filelimit, not opening dir]
├── lib64 -> lib
├── local
│   ├── bin
│   │   ├── gpg1v -> /usr/bin/gpgv
│   │   └── vless
│   ├── etc
│   ├── games
│   ├── include
│   ├── lib
│   ├── man
│   ├── sbin
│   ├── share
│   │   └── man -> ../man
│   └── src
├── sbin -> bin
├── share [243 entries exceeds filelimit, not opening dir]
└── src

19 directories, 2 files
2
  • Thanks @muru; this is close to what I am after, but I would like to show n files from those directories that have more than n files as well.
    – duhaime
    Commented Oct 17, 2015 at 12:43
  • 1
    For anybody looking to display the directories only, use tree /usr -d Commented May 18, 2020 at 8:47
0

The find shell command has options to limit output to files of certain max age only. This might help you.

0

The same question was asked on SU, and glallen wrote a Python script for it since tree doesn't have the option:


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

If a number is specified for -f [file limit] then ... <additional files> is printed and the other files are skipped. Additional directories should not be skipped however. If the file limit is set to 10000 (default) this acts as no limit

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

When run, it should produce output similar to:

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>

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .