Remove Prefix from Filenames Using Bash String Manipulation
📖 Scenario: You have a list of filenames that all start with the prefix temp_. You want to clean up these names by removing this prefix.
🎯 Goal: Build a bash script that removes the prefix temp_ from each filename using the ${var#pattern} string prefix removal syntax.
📋 What You'll Learn
Create a bash array called files with the exact filenames: temp_report.txt, temp_data.csv, temp_notes.md
Create a variable called prefix and set it to temp_
Use a for loop with variable file to iterate over files
Inside the loop, create a variable called clean_name that removes the prefix temp_ from file using ${file#${prefix}}
Print each clean_name on its own line
💡 Why This Matters
🌍 Real World
Removing prefixes from filenames is common when organizing files, cleaning up logs, or processing data exports.
💼 Career
Knowing bash string manipulation helps automate file management tasks efficiently in system administration and DevOps roles.
Progress0 / 4 steps
1
Create the list of filenames
Create a bash array called files with these exact filenames: temp_report.txt, temp_data.csv, temp_notes.md
Bash Scripting
Hint
Use parentheses () to create an array and double quotes "" around each filename.
2
Set the prefix variable
Create a variable called prefix and set it to the exact string temp_
Bash Scripting
Hint
Use prefix="temp_" to assign the string.
3
Remove the prefix using a loop
Use a for loop with variable file to iterate over files. Inside the loop, create a variable called clean_name that removes the prefix temp_ from file using ${file#${prefix}}
Bash Scripting
Hint
Use for file in "${files[@]}" to loop over the array. Use clean_name=${file#${prefix}} to remove the prefix.
4
Print the cleaned filenames
Inside the existing for loop, add a echo statement to print the variable clean_name on its own line
Bash Scripting
Hint
Use echo "$clean_name" inside the loop to print each cleaned filename.
Practice
(1/5)
1. What does the Bash expression ${var#pattern} do?
easy
A. Removes the shortest matching prefix pattern from the variable's value
B. Removes the longest matching suffix pattern from the variable's value
C. Removes the shortest matching suffix pattern from the variable's value
D. Removes the longest matching prefix pattern from the variable's value
Solution
Step 1: Understand the syntax
The syntax ${var#pattern} is used in Bash to remove a prefix pattern from the start of the variable's value.
Step 2: Identify shortest prefix removal
The single # removes the shortest matching prefix, unlike ## which removes the longest.
Final Answer:
Removes the shortest matching prefix pattern from the variable's value -> Option A
2. Which of the following is the correct syntax to remove the shortest prefix matching abc from variable var in Bash?
easy
A. ${var#abc}
B. ${var##abc}
C. ${var%abc}
D. ${var%%abc}
Solution
Step 1: Recall prefix removal syntax
Single # removes shortest prefix, double ## removes longest prefix. % and %% remove suffixes.
Step 2: Match the pattern
To remove shortest prefix matching 'abc', use ${var#abc}.
Final Answer:
${var#abc} -> Option A
Quick Check:
Shortest prefix removal = single # = B [OK]
Hint: Use single # for shortest prefix removal syntax [OK]
Common Mistakes:
Using ## instead of # for shortest prefix
Using % or %% which remove suffixes
Confusing prefix and suffix removal syntax
3. Given var="folder/subfolder/file.txt", what is the output of echo ${var#*/}?
medium
A. folder/subfolder/file.txt
B. subfolder/file.txt
C. file.txt
D. folder
Solution
Step 1: Understand the pattern */
The pattern */ matches the shortest prefix ending with a slash.
Step 2: Remove shortest prefix matching */
From "folder/subfolder/file.txt", the shortest prefix matching */ is "folder/". Removing it leaves "subfolder/file.txt".
Final Answer:
subfolder/file.txt -> Option B
Quick Check:
Remove shortest prefix ending with / = subfolder/file.txt [OK]
Hint: Pattern */ removes up to first slash [OK]
Common Mistakes:
Removing longest prefix with ## instead of #
Expecting only filename instead of subfolder/file.txt
Confusing prefix removal with suffix removal
4. Consider the script snippet:
var="abc123abc456"
echo ${var##abc*}
It outputs an empty line. Why?
medium
A. Because the pattern is invalid and causes an error
B. Because abc* matches the entire string as shortest prefix
C. Because abc* matches the longest prefix, so nothing remains
D. Because the variable is empty
Solution
Step 1: Analyze the pattern abc*
The pattern abc* matches 'abc' followed by zero or more any characters.
Step 2: Understand longest prefix removal
With ##, it removes the longest matching prefix. The * matches greedily as many characters as possible after 'abc', so the match covers the entire string.
Final Answer:
Because abc* matches the longest prefix, so nothing remains -> Option C
Quick Check:
Longest prefix with ## + greedy * = B [OK]
Hint: Wildcard * matches greedily with longest prefix ## [OK]
Common Mistakes:
Confusing ## (longest) with # (shortest)
Underestimating greedy nature of * in longest match
Assuming pattern causes error or variable is empty
5. You have a variable path="folder/home/user/docs/report.txt". Which command removes only the first slash and everything before it, leaving home/user/docs/report.txt?
hard
A. echo ${path#/*}
B. echo ${path##/*}
C. echo ${path##*/}
D. echo ${path#*/}
Solution
Step 1: Understand the variable value
The variable path is "folder/home/user/docs/report.txt".
Step 2: Analyze each option's pattern
${path#/*} removes shortest prefix matching slash followed by anything, but path doesn't start with /, so no match. ${path##/*} removes longest prefix matching slash-anything, no match. ${path##*/} removes longest prefix up to last slash, leaving only filename "report.txt". ${path#*/} removes shortest prefix up to first slash ("folder/"), leaving "home/user/docs/report.txt".
Step 3: Choose correct option
To remove up to the first slash, use ${path#*/}.
Final Answer:
echo ${path#*/} -> Option D
Quick Check:
Remove shortest prefix up to first slash = D [OK]
Hint: Use #*/ to remove up to first slash only [OK]
Common Mistakes:
Using ##*/ removes up to last slash (only filename)
Using #/* or ##/* which don't match without leading slash
Confusing prefix removal with suffix removal
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.