In Bash scripting, one of the most common tasks is manipulating file paths—especially when you want to extract just the file name from a full path. That’s where the basename command comes in. While seemingly simple, basename has powerful use cases when used correctly in more complex scripts, automation tools, hosting services, and CI/CD environments.
The basename command strips the directory path and optionally removes a file extension, leaving only the base name (the final component of a file path).
Here are just a few examples of real-world scripting needs:
Logging: Extract the name of a log file being processed.
Archiving: Append only the filename to a compressed archive.
Automation: Process batches of files and generate output filenames.
Pipelines: Extract file names in CI/CD steps.
This script loops over .log files, extracts the name without extension, and logs each action. basename simplifies filename handling without complex string slicing.
Let’s say you’re receiving full paths from user input or another process:
#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"
Using basename in your script ensures flexibility when working with dynamic file paths, especially in environments like a Linux VPS where logs, config files, and backups may reside in different directories. This makes your script robust regardless of whether it’s passed a full path like /var/log/syslog or a relative file like ./config.txt.
Use them together to isolate path elements:
#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"
If you want to remove known extensions:
⚠️ Note: This only works if the suffix matches exactly. So .txt works, but .TXT or .tar.gz won’t unless explicitly specified.
For multiple extensions, combine basename with other tools:
file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive
Or:
While basename is intuitive, it spawns a subprocess. For performance-critical scripts or large loops, prefer pure Bash alternatives:
✅ Faster than calling external basename.
Let’s say you want to prefix all .jpg files with today’s date: