Bird
Raised Fist0
Bash Scriptingscripting~20 mins

Looping over files and directories in Bash Scripting - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Loop Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
💻 Command Output
intermediate
2:00remaining
What is the output of this script when run in a directory with files a.txt, b.txt, and c.log?
Consider this bash script:
for file in *.txt; do echo "$file"; done
What will it print?
Bash Scripting
for file in *.txt; do echo "$file"; done
A*.txt
B
a.txt
b.txt
C
a.txt
b.txt
c.log
D
a.txt
b.txt
*.txt
Attempts:
2 left
💡 Hint
The wildcard *.txt matches only files ending with .txt.
💻 Command Output
intermediate
2:00remaining
What does this script output if the directory contains subdirectories dir1 and dir2?
Given this script:
for entry in *; do if [ -d "$entry" ]; then echo "$entry"; fi; done
What will it print?
Bash Scripting
for entry in *; do if [ -d "$entry" ]; then echo "$entry"; fi; done
A
dir1
dir2
B
dir1
dir2
file.txt
C*.txt
Dfile.txt
Attempts:
2 left
💡 Hint
The test -d checks if the entry is a directory.
📝 Syntax
advanced
2:00remaining
Which option correctly loops over all .log files and prints their names?
Choose the correct bash loop syntax to print all .log files in the current directory.
Afor file in *.log; do echo $file; done
Bfor file in *.log { echo $file; }
Cfor (file in *.log); do echo $file; done
Dforeach file in *.log; do echo $file; done
Attempts:
2 left
💡 Hint
Bash uses 'for var in list; do ... done' syntax.
🚀 Application
advanced
3:00remaining
How to count the number of files (not directories) in the current directory using a loop?
You want to count files only (exclude directories). Which script correctly does this?
A
count=0
for item in *; do count=$((count+1)); done
echo $count
B
count=0
for item in *; do if [ -d "$item" ]; then count=$((count+1)); fi; done
echo $count
C
count=0
for item in *; do if [ -f "$item" ]; then count=$((count+1)); fi; done
echo $count
D
count=0
for item in *; do if [ -e "$item" ]; then count=$((count+1)); fi; done
echo $count
Attempts:
2 left
💡 Hint
Use -f to test if an entry is a regular file.
🔧 Debug
expert
3:00remaining
Why does this script fail to print filenames with spaces correctly?
Script:
for file in $(ls *.txt); do echo "$file"; done

What is the problem?
Bash Scripting
for file in $(ls *.txt); do echo "$file"; done
AIt loops over directories instead of files
BIt does not expand *.txt pattern
CIt causes a syntax error due to missing quotes
DIt splits filenames on spaces, so multi-word names break into parts
Attempts:
2 left
💡 Hint
Command substitution splits output by spaces and newlines.

Practice

(1/5)
1. What does the following bash loop do?
for file in *; do echo "$file"; done
easy
A. It runs the echo command once without any output.
B. It deletes all files in the current folder.
C. It lists only directories in the current folder.
D. It prints the names of all files and directories in the current folder.

Solution

  1. Step 1: Understand the loop variable and pattern

    The loop uses * which matches all files and directories in the current folder.
  2. Step 2: Analyze the command inside the loop

    Each matched item is stored in file and printed with echo.
  3. Final Answer:

    It prints the names of all files and directories in the current folder. -> Option D
  4. Quick Check:

    Loop over * prints all names [OK]
Hint: Remember * matches all files and folders [OK]
Common Mistakes:
  • Thinking * matches only files, not directories
  • Assuming the loop deletes files
  • Believing echo runs only once
2. Which of the following is the correct syntax to loop over all directories only in the current folder?
easy
A. for dir in *; do if [ -f "$dir" ]; then echo "$dir"; fi; done
B. for dir in *; do echo "$dir"; done
C. for dir in */; do echo "$dir"; done
D. for dir in /*; do echo "$dir"; done

Solution

  1. Step 1: Understand the pattern for directories

    The pattern */ matches only directories in the current folder because directories end with a slash.
  2. Step 2: Check the loop and echo command

    The loop iterates over directories and prints their names correctly.
  3. Final Answer:

    for dir in */; do echo "$dir"; done -> Option C
  4. Quick Check:

    */ matches directories only [OK]
Hint: Use */ pattern to match directories only [OK]
Common Mistakes:
  • Using * matches files and directories, not only directories
  • Using -f to check for directories instead of -d
  • Using absolute path /* instead of current folder
3. What will be the output of this script if the current folder contains files: file1.txt, file2.txt and a directory docs/?
for item in *; do
  if [ -f "$item" ]; then
    echo "File: $item"
  else
    echo "Not a file: $item"
  fi
done
medium
A. File: file1.txt File: file2.txt Not a file: docs
B. File: file1.txt File: file2.txt File: docs
C. Not a file: file1.txt Not a file: file2.txt Not a file: docs
D. File: file1.txt Not a file: file2.txt Not a file: docs

Solution

  1. Step 1: Identify file and directory checks

    The script uses [ -f "$item" ] to check if the item is a file.
  2. Step 2: Apply checks to each item

    file1.txt and file2.txt are files, so print "File: ..."; docs is a directory, so print "Not a file: docs".
  3. Final Answer:

    File: file1.txt File: file2.txt Not a file: docs -> Option A
  4. Quick Check:

    -f true for files only [OK]
Hint: Use -f to test files, else it's not a file [OK]
Common Mistakes:
  • Assuming directories pass -f test
  • Confusing -f with -d
  • Expecting directory names with trailing slash
4. Find the error in this script that tries to print only directories:
for item in *; do
  if [ -f "$item" ]; then
    echo "$item"
  fi
done
medium
A. The echo command is missing quotes around $item.
B. It uses -f to check files instead of -d for directories.
C. The loop pattern * does not match any files.
D. The script will print directories correctly.

Solution

  1. Step 1: Understand the test used

    The script uses [ -f "$item" ] which checks if the item is a file, not a directory.
  2. Step 2: Identify correct test for directories

    To check directories, [ -d "$item" ] should be used instead.
  3. Final Answer:

    It uses -f to check files instead of -d for directories. -> Option B
  4. Quick Check:

    Use -d to test directories [OK]
Hint: Use -d to check directories, not -f [OK]
Common Mistakes:
  • Confusing -f and -d tests
  • Assuming * matches only directories
  • Ignoring quotes around variables
5. You want to count how many files (not directories) are in the current folder using a bash loop. Which script correctly does this?
hard
A. count=0 for item in *; do if [ -f "$item" ]; then count=$((count + 1)) fi done echo $count
B. count=0 for item in */; do count=$((count + 1)) done echo $count
C. count=0 for item in *; do if [ -d "$item" ]; then count=$((count + 1)) fi done echo $count
D. count=0 for item in *; do count=$((count + 1)) done echo $count

Solution

  1. Step 1: Understand the goal

    We want to count files only, so we must check each item with [ -f "$item" ].
  2. Step 2: Check each option

    count=0 for item in *; do if [ -f "$item" ]; then count=$((count + 1)) fi done echo $count correctly loops over all items, increments count only if item is a file, then prints count.
  3. Final Answer:

    count=0 for item in *; do if [ -f "$item" ]; then count=$((count + 1)) fi done echo $count -> Option A
  4. Quick Check:

    Use -f test and increment count [OK]
Hint: Increment count only if -f test passes [OK]
Common Mistakes:
  • Counting directories instead of files
  • Counting all items without checks
  • Using */ pattern which matches directories only
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard