The ls command in Linux is a widely-used command-line tool for listing the contents of a folder or directory. By default, ls only displays the contents of a specific directory without exploring its subdirectories.

The ls command in Linux is a widely-used command-line tool for listing the contents of a folder or directory. By default, ls only displays the contents of a specific directory without exploring its subdirectories.

Steps to get recursive directory listing in Linux:

  1. Use the recursive ls option to list files and folders.
    $ ls -R recursive/ 
    recursive/:
    subdirectory-01  subdirectory-02
    
    recursive/subdirectory-01:
    file-01  file-02  file-03
    
    recursive/subdirectory-02:
    file-01  file-02  file-03
    
    $ ls -lR recursive/
    recursive/:
    total 8
    drwxr-xr-x 2 user user 4096 Ogos 28 11:10 subdirectory-01
    drwxr-xr-x 2 user user 4096 Ogos 28 11:10 subdirectory-02
    
    recursive/subdirectory-01:
    total 0
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-01
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-02
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-03
    
    recursive/subdirectory-02:
    total 0
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-01
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-02
    -rw-r--r-- 1 user user 0 Ogos 28 11:10 file-03

    Other options for ls:

    $ ls --help
    Usage: ls [OPTION]... [FILE]...
    List information about the FILEs (the current directory by default).
    Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
    
    Mandatory arguments to long options are mandatory for short options too.
      -a, --all                  do not ignore entries starting with .
      -A, --almost-all           do not list implied . and ..
          --author               with -l, print the author of each file
      -b, --escape               print C-style escapes for nongraphic characters
          --block-size=SIZE      with -l, scale sizes by SIZE when printing them;
                                   e.g., '--block-size=M'; see SIZE format below
      -B, --ignore-backups       do not list implied entries ending with ~
      -c                         with -lt: sort by, and show, ctime (time of last
                                   modification of file status information);
                                   with -l: show ctime and sort by name;
                                   otherwise: sort by ctime, newest first
      -C                         list entries by columns
          --color[=WHEN]         colorize the output; WHEN can be 'always' (default
                                   if omitted), 'auto', or 'never'; more info below
      -d, --directory            list directories themselves, not their contents
      -D, --dired                generate output designed for Emacs' dired mode
      -f                         do not sort, enable -aU, disable -ls --color
      -F, --classify             append indicator (one of */=>@|) to entries
          --file-type            likewise, except do not append '*'
          --format=WORD          across -x, commas -m, horizontal -x, long -l,
                                   single-column -1, verbose -l, vertical -C
          --full-time            like -l --time-style=full-iso
      -g                         like -l, but do not list owner
          --group-directories-first
                                 group directories before files;
                                   can be augmented with a --sort option, but any
                                   use of --sort=none (-U) disables grouping
      -G, --no-group             in a long listing, don't print group names
      -h, --human-readable       with -l and -s, print sizes like 1K 234M 2G etc.
          --si                   likewise, but use powers of 1000 not 1024
      -H, --dereference-command-line
                                 follow symbolic links listed on the command line
          --dereference-command-line-symlink-to-dir
                                 follow each command line symbolic link
                                   that points to a directory
          --hide=PATTERN         do not list implied entries matching shell PATTERN
                                   (overridden by -a or -A)
          --hyperlink[=WHEN]     hyperlink file names; WHEN can be 'always'
                                   (default if omitted), 'auto', or 'never'
          --indicator-style=WORD  append indicator with style WORD to entry names:
                                   none (default), slash (-p),
                                   file-type (--file-type), classify (-F)
      -i, --inode                print the index number of each file
      -I, --ignore=PATTERN       do not list implied entries matching shell PATTERN
      -k, --kibibytes            default to 1024-byte blocks for disk usage;
                                   used only with -s and per directory totals
      -l                         use a long listing format
      -L, --dereference          when showing file information for a symbolic
                                   link, show information for the file the link
                                   references rather than for the link itself
      -m                         fill width with a comma separated list of entries
      -n, --numeric-uid-gid      like -l, but list numeric user and group IDs
      -N, --literal              print entry names without quoting
      -o                         like -l, but do not list group information
      -p, --indicator-style=slash
                                 append / indicator to directories
      -q, --hide-control-chars   print ? instead of nongraphic characters
          --show-control-chars   show nongraphic characters as-is (the default,
                                   unless program is 'ls' and output is a terminal)
      -Q, --quote-name           enclose entry names in double quotes
          --quoting-style=WORD   use quoting style WORD for entry names:
                                   literal, locale, shell, shell-always,
                                   shell-escape, shell-escape-always, c, escape
                                   (overrides QUOTING_STYLE environment variable)
      -r, --reverse              reverse order while sorting
      -R, --recursive            list subdirectories recursively
      -s, --size                 print the allocated size of each file, in blocks
      -S                         sort by file size, largest first
          --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
                                   time (-t), version (-v), extension (-X)
          --time=WORD            with -l, show time as WORD instead of default
                                   modification time: atime or access or use (-u);
                                   ctime or status (-c); also use specified time
                                   as sort key if --sort=time (newest first)
          --time-style=TIME_STYLE  time/date format with -l; see TIME_STYLE below
      -t                         sort by modification time, newest first
      -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
      -u                         with -lt: sort by, and show, access time;
                                   with -l: show access time and sort by name;
                                   otherwise: sort by access time, newest first
      -U                         do not sort; list entries in directory order
      -v                         natural sort of (version) numbers within text
      -w, --width=COLS           set output width to COLS.  0 means no limit
      -x                         list entries by lines instead of by columns
      -X                         sort alphabetically by entry extension
      -Z, --context              print any security context of each file
      -1                         list one file per line.  Avoid '\n' with -q or -b
          --help     display this help and exit
          --version  output version information and exit
    
    The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
    Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
    
    The TIME_STYLE argument can be full-iso, long-iso, iso, locale, or +FORMAT.
    FORMAT is interpreted like in date(1).  If FORMAT is FORMAT1<newline>FORMAT2,
    then FORMAT1 applies to non-recent files and FORMAT2 to recent files.
    TIME_STYLE prefixed with 'posix-' takes effect only outside the POSIX locale.
    Also the TIME_STYLE environment variable sets the default style to use.
    
    Using color to distinguish file types is disabled both by default and
    with --color=never.  With --color=auto, ls emits color codes only when
    standard output is connected to a terminal.  The LS_COLORS environment
    variable can change the settings.  Use the dircolors command to set it.
    
    Exit status:
     0  if OK,
     1  if minor problems (e.g., cannot access subdirectory),
     2  if serious trouble (e.g., cannot access command-line argument).
    
    GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
    Full documentation at: <https://www.gnu.org/software/coreutils/ls>
    or available locally via: info '(coreutils) ls invocation'
  2. Use the find command with either the -ls or -print option.
    $ find recursive/ -ls
       536809      4 drwxr-xr-x   4 user     user         4096 Ogos 28 11:10 recursive/
       536810      4 drwxr-xr-x   2 user     user         4096 Ogos 28 11:10 recursive/subdirectory-01
       536812      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-01/file-01
       538821      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-01/file-03
       538820      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-01/file-02
       536811      4 drwxr-xr-x   2 user     user         4096 Ogos 28 11:10 recursive/subdirectory-02
       541987      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-02/file-01
       541989      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-02/file-03
       541988      0 -rw-r--r--   1 user     user            0 Ogos 28 11:10 recursive/subdirectory-02/file-02
    
    $ find recursive/ -print
    recursive/
    recursive/subdirectory-01
    recursive/subdirectory-01/file-01
    recursive/subdirectory-01/file-03
    recursive/subdirectory-01/file-02
    recursive/subdirectory-02
    recursive/subdirectory-02/file-01
    recursive/subdirectory-02/file-03
    recursive/subdirectory-02/file-02

    Other options for find:

    $ find --help
    Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
    
    default path is the current directory; default expression is -print
    expression may consist of: operators, options, tests, and actions:
    operators (decreasing precedence; -and is implicit where no others are given):
          ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
          EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2
    positional options (always true): -daystart -follow -regextype
    
    normal options (always true, specified before other expressions):
          -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
          --version -xdev -ignore_readdir_race -noignore_readdir_race
    tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
          -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
          -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
          -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
          -nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN
          -readable -writable -executable
          -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
          -used N -user NAME -xtype [bcdpfls]      -context CONTEXT
    
    actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
          -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
          -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
          -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
    
    Valid arguments for -D:
    exec, opt, rates, search, stat, time, tree, all, help
    Use '-D help' for a description of the options, or see find(1)
    
    Please see also the documentation at http://www.gnu.org/software/findutils/.
    You can report (and track progress on fixing) bugs in the "find"
    program via the GNU findutils bug-reporting page at
    https://savannah.gnu.org/bugs/?group=findutils or, if
    you have no web access, by sending email to <bug-findutils@gnu.org>.
  3. Use the du command with the -a switch to display files and directories.
    $ du -a recursive/
    0	recursive/subdirectory-01/file-01
    0	recursive/subdirectory-01/file-03
    0	recursive/subdirectory-01/file-02
    4	recursive/subdirectory-01
    0	recursive/subdirectory-02/file-01
    0	recursive/subdirectory-02/file-03
    0	recursive/subdirectory-02/file-02
    4	recursive/subdirectory-02
    12	recursive/

    Other options for du:

    $ du --help
    Usage: du [OPTION]... [FILE]...
      or:  du [OPTION]... --files0-from=F
    Summarize disk usage of the set of FILEs, recursively for directories.
    
    Mandatory arguments to long options are mandatory for short options too.
      -0, --null            end each output line with NUL, not newline
      -a, --all             write counts for all files, not just directories
          --apparent-size   print apparent sizes, rather than disk usage; although
                              the apparent size is usually smaller, it may be
                              larger due to holes in ('sparse') files, internal
                              fragmentation, indirect blocks, and the like
      -B, --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                               '-BM' prints sizes in units of 1,048,576 bytes;
                               see SIZE format below
      -b, --bytes           equivalent to '--apparent-size --block-size=1'
      -c, --total           produce a grand total
      -D, --dereference-args  dereference only symlinks that are listed on the
                              command line
      -d, --max-depth=N     print the total for a directory (or file, with --all)
                              only if it is N or fewer levels below the command
                              line argument;  --max-depth=0 is the same as
                              --summarize
          --files0-from=F   summarize disk usage of the
                              NUL-terminated file names specified in file F;
                              if F is -, then read names from standard input
      -H                    equivalent to --dereference-args (-D)
      -h, --human-readable  print sizes in human readable format (e.g., 1K 234M 2G)
          --inodes          list inode usage information instead of block usage
      -k                    like --block-size=1K
      -L, --dereference     dereference all symbolic links
      -l, --count-links     count sizes many times if hard linked
      -m                    like --block-size=1M
      -P, --no-dereference  don't follow any symbolic links (this is the default)
      -S, --separate-dirs   for directories do not include size of subdirectories
          --si              like -h, but use powers of 1000 not 1024
      -s, --summarize       display only a total for each argument
      -t, --threshold=SIZE  exclude entries smaller than SIZE if positive,
                              or entries greater than SIZE if negative
          --time            show time of the last modification of any file in the
                              directory, or any of its subdirectories
          --time=WORD       show time as WORD instead of modification time:
                              atime, access, use, ctime or status
          --time-style=STYLE  show times using STYLE, which can be:
                                full-iso, long-iso, iso, or +FORMAT;
                                FORMAT is interpreted like in 'date'
      -X, --exclude-from=FILE  exclude files that match any pattern in FILE
          --exclude=PATTERN    exclude files that match PATTERN
      -x, --one-file-system    skip directories on different file systems
          --help     display this help and exit
          --version  output version information and exit
    
    Display values are in units of the first available SIZE from --block-size,
    and the DU_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
    Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).
    
    The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
    Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
    
    GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
    Full documentation at: <https://www.gnu.org/software/coreutils/du>
    or available locally via: info '(coreutils) du invocation'
  4. Use the tree program for a hierarchical view of files and folders.
    $ tree recursive/
    recursive/
    ├── subdirectory-01
    │   ├── file-01
    │   ├── file-02
    │   └── file-03
    └── subdirectory-02
        ├── file-01
        ├── file-02
        └── file-03
    
    2 directories, 6 files
    $ tree -i -f  recursive/ # (-f: full path, -i: no indentation)
    recursive
    recursive/subdirectory-01
    recursive/subdirectory-01/file-01
    recursive/subdirectory-01/file-02
    recursive/subdirectory-01/file-03
    recursive/subdirectory-02
    recursive/subdirectory-02/file-01
    recursive/subdirectory-02/file-02
    recursive/subdirectory-02/file-03
    
    2 directories, 6 files

    tree is normally not installed by default in most Linux distributions, and could be easily installed from the command line:

    $ sudo apt update && sudo apt install --assume-yes tree # Ubuntu & Debian

    Other options for tree:

    $ tree --help
    usage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-H baseHREF] [-T title ]
    	[-L level [-R]] [-P pattern] [-I pattern] [-o filename] [--version]
    	[--help] [--inodes] [--device] [--noreport] [--nolinks] [--dirsfirst]
    	[--charset charset] [--filelimit[=]#] [--si] [--timefmt[=]<f>]
    	[--sort[=]<name>] [--matchdirs] [--ignore-case] [--fromfile] [--]
    	[<directory list>]
      ------- Listing options -------
      -a            All files are listed.
      -d            List directories only.
      -l            Follow symbolic links like directories.
      -f            Print the full path prefix for each file.
      -x            Stay on current filesystem only.
      -L level      Descend only level directories deep.
      -R            Rerun tree when max dir level reached.
      -P pattern    List only those files that match the pattern given.
      -I pattern    Do not list files that match the given pattern.
      --ignore-case Ignore case when pattern matching.
      --matchdirs   Include directory names in -P pattern matching.
      --noreport    Turn off file/directory count at end of tree listing.
      --charset X   Use charset X for terminal/HTML and indentation line output.
      --filelimit # Do not descend dirs with more than # files in them.
      --timefmt <f> Print and format time according to the format <f>.
      -o filename   Output to file instead of stdout.
      ------- File options -------
      -q            Print non-printable characters as '?'.
      -N            Print non-printable characters as is.
      -Q            Quote filenames with double quotes.
      -p            Print the protections for each file.
      -u            Displays file owner or UID number.
      -g            Displays file group owner or GID number.
      -s            Print the size in bytes of each file.
      -h            Print the size in a more human readable way.
      --si          Like -h, but use in SI units (powers of 1000).
      -D            Print the date of last modification or (-c) status change.
      -F            Appends '/', '=', '*', '@', '|' or '>' as per ls -F.
      --inodes      Print inode number of each file.
      --device      Print device ID number to which each file belongs.
      ------- Sorting options -------
      -v            Sort files alphanumerically by version.
      -t            Sort files by last modification time.
      -c            Sort files by last status change time.
      -U            Leave files unsorted.
      -r            Reverse the order of the sort.
      --dirsfirst   List directories before files (-U disables).
      --sort X      Select sort: name,version,size,mtime,ctime.
      ------- Graphics options -------
      -i            Don't print indentation lines.
      -A            Print ANSI lines graphic indentation lines.
      -S            Print with CP437 (console) graphics indentation lines.
      -n            Turn colorization off always (-C overrides).
      -C            Turn colorization on always.
      ------- XML/HTML/JSON options -------
      -X            Prints out an XML representation of the tree.
      -J            Prints out an JSON representation of the tree.
      -H baseHREF   Prints out HTML format with baseHREF as top directory.
      -T string     Replace the default HTML title and H1 header with string.
      --nolinks     Turn off hyperlinks in HTML output.
      ------- Input options -------
      --fromfile    Reads paths from files (.=stdin)
      ------- Miscellaneous options -------
      --version     Print version and exit.
      --help        Print usage and this help message and exit.
      --            Options processing terminator.
Discuss the article:

Comment anonymously. Login not required.