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?

kos
  • 35,891
duhaime
  • 618

3 Answers3

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
muru
  • 197,895
  • 55
  • 485
  • 740
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>
0

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

Roland
  • 194