w3resource

Bash Listing Files and Directories: Exercises, Solutions, and Explanations

1.

Write a Bash script that lists all files and directories in the current directory.

Code:

#!/bin/bash

# List all files and directories in the current directory
ls -al

Output:

total 28
drwxr-xr-x 1 rg   rg    512 Apr 17 18:23 .
drwxr-xr-x 1 root root  512 Jan 17  2022 ..
-rw-r--r-- 1 rg   rg      2 Apr 15 22:40 abc.sh
-rw------- 1 rg   rg   2068 Apr 16 16:13 .bash_history
-rw-r--r-- 1 rg   rg    220 Jan 17  2022 .bash_logout
-rw-r--r-- 1 rg   rg   3771 Jan 17  2022 .bashrc
drwxr-xr-x 1 rg   rg    512 Apr 17 12:29 destination_dir
-rw-r--r-- 1 rg   rg    284 Apr 13 18:09 input.txt
drwxr-xr-x 1 rg   rg    512 Apr 17 14:04 new_dir
drwxr-xr-x 1 rg   rg    512 Apr 17 11:18 new_workarea
-rw-r--r-- 1 rg   rg      2 Apr 13 18:15 nums.txt
-rw-r--r-- 1 rg   rg     67 Apr 17 11:42 old_error.log
-rw-r--r-- 1 rg   rg    416 Apr 13 18:17 output.txt
drwxr-xr-x 1 rg   rg    512 Apr 17 16:04 parent_directory
-rw-r--r-- 1 rg   rg    655 Jan 17  2022 .profile
drwxr-xr-x 1 rg   rg    512 Jun 10  2022 .vim
-rw------- 1 rg   rg   6695 Apr 17 18:23 .viminfo

Explanation:

In the exercise above,

The script utilizes the "ls" command with the -al options to list all files and directories, including hidden ones, with detailed information.

2.

Write a Bash script that lists only the files in the current directory.

Code:

#!/bin/bash

# Bash script to list only files in the current directory
for file in *; do
    if [ -f "$file" ]; then
        echo "$file"
    fi
done

Output:

abc.sh
document.txt
erorrrr.log
file2.txt
input.txt
nums.txt
old_error.log
output.txt
sample.txt
test1.sh
test.sh

Explanation:

In the exercise above,

  • for file in ; do: This line starts a loop that iterates over each item in the current directory (). The * wildcard matches all files and directories in the current directory.
  • if [ -f "$file" ]; then: This line checks if the current item ('$file') is a regular file using the -f test operator. If it is a regular file, the code inside the "if" block will be executed.
  • echo "$file": This line prints the name of the file ('$file') to the standard output.
  • done: This line marks the end of the loop.

3.

Write a Bash script that lists only the directories in the current directory.

Code:

# Bash script to list only directories in the current directory
for dir in */; do
    if [ -d "$dir" ]; then
        echo "$dir"
    fi
done

Output:

destination_dir/
new_dir/
new_workarea/
parent_directory/
source_directory/
test/

Explanation:

In the exercise above,

  • for dir in /; do: This line starts a loop that iterates over each item in the current directory (/). The */ pattern matches all directories in the current directory.
  • if [ -d "$dir" ]; then: This line checks if the current item ('$dir') is a directory using the -d test operator. If it is a directory, the code inside the "if" block will be executed.
  • echo "$dir": This line prints the name of the directory ('$dir') to the standard output.
  • done: This line marks the end of the loop.

4.

Write a Bash script that lists all files and directories in a specific directory provided as an argument to the script.

Code:

#!/bin/bash

# Check if an argument is provided
if [ $# -ne 1 ]; then
    echo "Usage: $0 directory_path"
    exit 1
fi

# Check if the provided argument is a directory
if [ ! -d "$1" ]; then
    echo "$1 is not a directory."
    exit 1
fi

# List all files and directories in the provided directory
echo "Files and directories in $1:"
ls -al "$1"

Output:

ad@DESKTOP-3KE0KU4:~$ ./test1.sh test.txt
test.txt is not a directory.
ad@DESKTOP-3KE0KU4:~$ ./test1.sh parent_directory
Files and directories in parent_directory:
total 0
drwxr-xr-x 1 rg rg 512 Apr 17 16:04 .
drwxr-xr-x 1 rg rg 512 Apr 17 20:15 ..
drwxr-xr-x 1 rg rg 512 Apr 17 16:04 workarea
drwxr-xr-x 1 rg rg 512 Apr 17 16:04 workarea2

Explanation:

In the exercise above,

  • if [ $# -ne 1 ]; then: This line checks if the number of arguments provided to the script is not equal to 1.
  • echo "Usage: $0 directory_path": If the number of arguments is incorrect, this line prints the correct usage of the script.
  • exit 1: This line exits the script with a non-zero status, indicating an error.
  • if [ ! -d "$1" ]; then: This line checks if the provided argument (directory path) is not a directory.
  • echo "$1 is not a directory.": If the provided argument is not a directory, this line prints an error message.
  • echo "Files and directories in $1:": This line prints a message indicating the directory whose contents are going to be listed.
  • ls -al "$1": This line lists all files and directories in the provided directory ('$1') along with detailed information (-al options for ls command).

5.

Write a Bash script that lists all hidden files (files starting with a dot) in the current directory.

Code:

#!/bin/bash

# List all hidden files in the current directory
for file in .*; do
    if [ -f "$file" ]; then
        echo "$file"
    fi
done

Output:

.bash_history
.bash_logout
.bashrc
.profile
.viminfo

Explanation:

In the exercise above,

  • for file in .*; do: This line starts a loop that iterates over each entry in the current directory starting with a dot.
  • if [ -f "$file" ]; then: This line checks if the current entry is a regular file.
  • echo "$file": If the current entry is a regular file, this line prints its name.
  • done: This line marks the end of the loop.

6.

Write a Bash script that lists all files modified within the last 24 hours in the current directory.

Code:

#!/bin/bash

# List all files modified within the last 24 hours in the current directory
find . -type f -mtime -1 -print

Output:

./.viminfo
./destination_dir/abc.txt
./destination_dir/pqr.txt
./erorrrr.log
./old_error.log
./source_directory/abc.txt
./source_directory/pqr.txt
./test.sh
./test1.sh

Explanation:

In the exercise above,

find . -type f -mtime -1 -print: This command searches for files (-type f) in the current directory (.) that have been modified within the last 24 hours (-mtime -1) and prints their paths (-print).

7.

Write a Bash script that lists all files larger than 1MB in the current directory.

Code:

#!/bin/bash

# List all files larger than 1MB in the current directory
find . -type f -size +1M -exec ls -lh {} \;

Explanation:

In the exercise above,

find . -type f -size +1M -exec ls -lh {} \;: This command searches for files (-type f) in the current directory (.) that are larger than 1MB (-size +1M) and executes the ls -lh command on each of them to list their details in a human-readable format.

8.

Write a Bash script that lists all empty files in the current directory.

Code:

#!/bin/bash

# List all empty files in the current directory
find . -maxdepth 1 -type f -empty -exec ls -lh {} \;

Output:

-rw-r--r-- 1 rg rg 0 Apr 17 22:33 ./input.txt
-rw-r--r-- 1 rg rg 0 Apr 18 07:44 ./input1.txt

Explanation:

In the exercise above,

find . -maxdepth 1 -type f -empty -exec ls -lh {} \;: This command searches for files ('-type f') in the current directory (.) that are empty ('-empty') and executes the "ls -lh" command on each of them to list their details in a human-readable format. The "-maxdepth 1" option ensures that only the files in the current directory are considered, not in its subdirectories.

9.

Write a Bash script that lists all files with a specific extension (e.g., ".txt") in the current directory.

Code:

#!/bin/bash

# List all files with a specific extension in the current directory
extension=".txt"
for file in *"$extension"; do
    if [ -f "$file" ]; then
        echo "$file"
    fi
done

Output:

document.txt
file2.txt
input1.txt
input.txt
nums.txt
output.txt
sample.txt

Explanation:

In the exercise above,

  • extension=".txt": This variable stores the specific extension you want to search for. You can change it to any desired extension.
  • for file in *"$extension"; do: This loop iterates over all files in the current directory with the specified extension.
  • if [ -f "$file" ]; then: This condition checks if the current item in the loop is a regular file.
  • echo "$file": If the file is a regular file, its name is echoed, indicating that it matches the specified extension.

Bash Editor:


More to Come !

Do not submit any solution of the above exercises at here, if you want to contribute go to the appropriate exercise page.



Follow us on Facebook and Twitter for latest update.