简体   繁体   中英

How to list directories and files in a Bash by script?

I would like to list directory tree, but I have to write script for it and as parameter script should take path to base directory. Listing should start from this base directory.

The output should look like this:

Directory: ./a
File: ./a/A
Directory: ./a/aa
File: ./a/aa/AA
Directory: ./a/ab
File: ./a/ab/AB

So I need to print path from the base directory for every directory and file in this base directory.

UPDATED

Running the script I should type in the terminal this: ".\\test.sh /home/usr/Desktop/myDirectory" or ".\\test.sh myDirectory" - since I run the test.sh from the Desktop level. And right now the script should be run from the level of /home/usr/Dekstop/myDirectory"

I have the following command in my test.sh file:

find . | sed -e "s/[^-][^\/]*\//  |/g"

But It is the command , not shell code and prints the output like this:

DIR: dir1
    DIR: dir2
      fileA
    DIR: dir3
    fileC
fileB

How to print the path from base directory for every dir or file from the base dir? Could someone help me to work it out?

Not clear what you want maybe,

find . -type d -printf 'Directory: %p\n' -o -type f -printf 'File: %p\n'

However to see the subtree of a directory, I find more useful

find "$dirname" -type f

To answer comment it can also be done in pure bash (builtin without external commands), using a recursive function.

rec_find() {
    local f
    for f in "$1"/*; do
        [[ -d $f ]] && echo "Directory: $f" && rec_find "$f"
        [[ -f $f ]] && echo "File: $f"
    done
}

rec_find "$1"

You can use tree command. Key -L means max depth. Examples:

tree
.
├── 1
│   └── test
├── 2
│   └── test
└── 3
    └── test

3 directories, 3 files

Or

tree -L 1
.
├── 1
├── 2
└── 3

3 directories, 0 files

Create your test.sh with the below codes. Here you are reading command line parameter in system variable $1 and provides parameter to find command.

#!/bin/bash #in which shell you want to execute this script

find $1 | sed -e "s/[^-][^\/]*\//  |/g"

Now how will it work:-

./test.sh /home/usr/Dekstop/myDirectory #you execute this command

Here command line parameter will be assign into $1. More than one parameter you can use $1 till $9 and after that you have to use shift command. (You will get more detail information online).

So your command will be now:-

#!/bin/bash #in which shell you want to execute this script

find /home/usr/Dekstop/myDirectory | sed -e "s/[^-][^\/]*\//  |/g"  

Hope this will help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM