How to Strip Suffix with Basename Inside a Find -exec Command?

Abstract: Strip file suffixes in find -exec commands by invoking sh -c with parameter expansion to handle dynamic extensions.

Created: 2026-09-13 by

To strip a file suffix using basename inside a find -exec command, you must invoke a shell explicitly because basename does not support parameter expansion natively. Use the form -exec sh -c 'echo "${1%.*}"' _ {} \;. This approach leverages the shell's built-in string manipulation to remove the shortest match of the pattern .* from the end of the filename provided by find.

The Challenge with Direct Execution

When working with the find utility in Linux, developers often need to process filenames returned by the search. A common requirement is to transform these names, such as removing an extension (suffix) like .txt or .jpg. The instinct might be to pass the filename directly to basename, but this tool has limitations when used in isolation within the -exec context. The standard basename command can remove a specified suffix if it matches exactly. For example, basename file.txt .txt returns file. However, if you do not know the exact extension beforehand, or if you want to remove everything after the last dot regardless of what follows, basename alone cannot handle variable patterns. It lacks the ability to perform pattern matching against the end of a string dynamically. Furthermore, even if you attempt to use shell-specific syntax like ${var%.*} directly in the -exec argument, it will fail. The find command executes the specified binary directly; it does not interpret shell operators unless you explicitly tell it to run a shell interpreter. Without invoking a shell, the percent sign and asterisk are treated as literal characters or cause syntax errors depending on the surrounding context.

Invoking a Shell for String Manipulation

To solve this, you must wrap your logic in a shell invocation. The most robust method uses sh -c. This allows you to write standard shell scripts inline, giving you access to parameter expansion features. The structure of the command is: find . -type f -exec sh -c 'command "$@"' _ {} + Here is the breakdown of why this works: - sh -c: Tells find to start a new shell process. - 'command "$@"': The script to run. $@ represents all arguments passed to the shell. - _: This is a placeholder for $0, the name of the shell script. It is conventionally set to an underscore. - {}: Represents the current file path found by find. - +: Replaces \; and passes multiple files to the shell at once for better performance. Inside the single quotes, you can use any valid shell syntax. To strip the suffix, use the parameter expansion operator %.

Implementing the Suffix Removal

The core mechanism for removing a suffix in Bash and POSIX shells is ${variable%pattern}. The % operator removes the shortest match of the pattern from the end of the variable. To remove the extension, the pattern is .*, which means "a dot followed by any characters." Consider the following command:
find . -name "*.jpg" -exec sh -c 'for f; do echo "${f%.*}"; done' _ {} +
In this example: 1. find locates all files ending in .jpg. 2. sh -c starts a shell. 3. The loop for f; do ... done iterates over each file passed in $@. 4. "${f%.*}" takes the filename f and strips the last dot and everything after it. 5. echo prints the result. If you have a file named photo.jpg, ${f%.*} evaluates to photo. If the file is archive.tar.gz, it becomes archive.tar because % only removes the shortest match from the end.

Handling Multiple Files Efficiently

Using \; instead of + runs the shell once per file. This is slow for large directories. Using + batches files. When batching, the shell receives multiple arguments. You must iterate through them using a loop (for f; do) to process each one individually. Failing to loop will result in the shell processing only the first file or concatenating them incorrectly. For more complex transformations, you can assign variables inside the shell script for clarity:
find . -type f -exec sh -c '
  for f; do
    base="${f%.*}"
    ext="${f##*.}"
    echo "Name: $base, Ext: $ext"
  done
' _ {} +
This demonstrates how powerful inline shell scripting can be when combined with find. It avoids the overhead of spawning external processes for every single file operation.

Alternative Approaches

While sh -c is the most portable and reliable method for find -exec, there are alternatives depending on your environment.

Using xargs

You can pipe find output to xargs and then to a shell: find . -name "*.txt" | xargs -I {} sh -c 'echo "${1%.*}"' _ {} However, this breaks if filenames contain spaces or newlines. find -exec ... + handles whitespace correctly out of the box, making it safer for general use.

Bash Loops

If you are already writing a Bash script, consider using globbing instead of find for simple recursive searches: for f in **/*.txt; do echo "${f%.*}"; done This is cleaner but less flexible than find for complex criteria (like permissions or modification times). For related tasks involving string manipulation, you might find our guide on removing last characters from file names in Bash useful. Additionally, if you are dealing with batch renaming operations, see our article on copying and renaming image files recursively.

Common Pitfalls

- Double Quotes: Always quote "${f%.*}". Without quotes, filenames with spaces will be split into multiple words, causing errors. - Pattern Matching: Remember that % removes the shortest match. Use %% to remove the longest match from the end. For file.tar.gz, ${f%.*} gives file.tar, while ${f%%.*} gives file. - Shell Compatibility: Parameter expansion is supported in Bash, Zsh, and modern Dash (Debian's default /bin/sh). Avoid using Bashisms like ${var//pattern/repl} if you intend to run this on systems where /bin/sh is not Bash.

Frequently Asked Questions

Why doesn't basename work for dynamic suffix removal?

basename requires an exact string match for the suffix argument. It cannot interpret wildcards or patterns like .*. Therefore, it fails when you need to remove extensions of varying lengths or types without knowing them in advance.

Can I use bash instead of sh in the exec command?

Yes, if your system supports it, you can replace sh with bash. This grants access to advanced Bash features like arrays and regex matching. However, sh is generally preferred for portability across different Unix-like systems.

How do I handle files with no extension?

If a file has no extension, ${f%.*} returns the original filename unchanged. This is safe behavior. If you need to distinguish between files with and without extensions, check if ${f##*.} equals ${f}. If they are equal, the file has no dot.

Is it faster to use find -exec or xargs?

find -exec ... + is typically faster than piping to xargs because it avoids the overhead of setting up pipes and handling intermediate buffering. Both methods are significantly faster than using \; which spawns a process per file.

What if I need to modify the filename in place?

find itself cannot rename files based on computed values easily. You would typically combine find with mv inside the shell script: mv "$f" "${f%.*}_new". Be cautious with renaming during iteration to avoid conflicts.

Latest News

How to Display Output of xterm Command in Terminal Screen using Cron

Resolve the inability to display xterm output in a terminal screen from cron by redirecting logs or using wall instead of insecure X11 workarounds.

Read More
Expose Local Server on VPS Preserving Real Client IPs (OS Level)

Resolve VPS logging showing only gateway IPs by configuring reverse proxies to forward real client addresses via X-Forwarded-For headers.

Read More
How to Clear Recent Files History in Linux without Deleting Actual Files?

Clear recent files history in Linux by deleting ~/.local/share/recently-used.xbel without removing the actual files.

Read More
Best HDD Copy Strategy: Manually Syncing and Rewriting Scratch

Resolve data drift between two 4TB hard drives by using rsync with the --delete flag to manually sync and rewrite scratch data for an exact mirror.

Read More
Understanding Bash Prompt Abbreviations: An Overview

Resolve repetitive typing errors by creating and persisting Bash aliases in the .bashrc file for improved command-line efficiency.

Read More
Free Tools and Methods to Log Real-Time Performance Details in Task Manager

Log real-time CPU and memory metrics to CSV files using Windows Performance Monitor Data Collector Sets to troubleshoot system slowness.

Read More
Contact Qatar Airways Customer Service: Phone Number, Help Center, and More

Resolve urgent Qatar Airways reservation issues like flight changes and baggage claims using the US phone number +1801-855-5905 or online self-service tools.

Read More
Windows 11: Alt Codes Displaying Wrong Characters - Solutions

Resolve Windows 11 Alt codes showing wrong characters by verifying the US keyboard layout and enabling Num Lock.

Read More
Run Programs with Elevated Privileges: A Comprehensive Guide

Eliminates the need to type sudo for frequent administrative tasks by configuring .bashrc aliases or functions.

Read More
Dynamically Changing Dates in Excel Formulas Using Cells

Eliminate manual date updates in Excel by using cell references to create dynamic formulas that automatically adjust calculations when input dates change.

Read More
Granting Edit Access to a Specific Excel Sheet in an Office 365 User Email ID-Based Login

Excel Online lacks native sheet-level permissions, so users must split workbooks or use worksheet protection to isolate edit access for specific tabs.

Read More
Creating Network Load on Local Wi-Fi from One PC

Generate sustained Wi-Fi bandwidth load from a single PC using a VM SFTP server to test router stability and throughput.

Read More
Changing the Default Editor for Batch Files in Windows 11's File Explorer

Resolve the issue of batch files opening in Notepad by changing the default editor to a preferred application like VS Code.

Read More
Gain WiFi Connection Minutes Before Losing it by Changing MAC Address

Bypass MAC address filtering to restore WiFi connectivity temporarily when a device is blocked by network administrators.

Read More
Photos Folders Turned Black: Troubleshooting Picture Applications on Windows

Resolve black screens in Windows Photos by resetting the app, updating graphics drivers, and repairing system files.

Read More
Troubleshooting High CPU Temperature Values: A Step-by-Step Guide

Resolve high CPU temperatures and thermal throttling by monitoring with Speedfan, cleaning dust from cooling components, and replacing degraded thermal paste.

Read More
Make cURL establish TLS connection with CA unknown

Resolve cURL TLS connection failures with unknown or self-signed certificates by using the --insecure flag to bypass CA validation.

Read More
Troubleshooting Incorrect Network Metrics Values in Grafana, Prometheus, InfluxDB, and Telegraf

Fix incorrect network metrics in Grafana, Prometheus, InfluxDB, and Telegraf by verifying interface selection, resolving unit mismatches, and handling counter resets.

Read More
Start Another Terminal Window (cmd.exe) Windows Repair/Troubleshoot

Provides step-by-step instructions to access the Windows Command Prompt via bootable media for advanced system repair and troubleshooting.

Read More
Thinkpad P1 Gen 6: Sudden Thunderbolt 3 Dock USB-C Charging Stopped Working

Resolve sudden Thunderbolt 3 dock USB-C charging and internet failure on ThinkPad P1 Gen 6 by updating firmware, resetting the dock, and adjusting power settings.

Read More
ASUS Windows 11 Laptop: Internet Connection Issue with Hotspot

Resolve ASUS Windows 11 laptop spinning wheel issue when connecting to mobile hotspot by resetting network stack, disabling IPv6, and adjusting power settings.

Read More
Developing iOS Project with Firebase: Logging in and Sending Push Notifications

Integrates Firebase to enable secure user authentication and push notifications in iOS applications.

Read More
Troubleshooting Bash Script with Suspected Issues of Spaces, Dashes, Filenames and Quoting

Resolve Bash script failures caused by word splitting, globbing, and special characters in filenames by applying proper quoting techniques.

Read More
Populating OneDrive Folder for Local Backup without Affecting Remote Files

Prevent OneDrive from deleting remote files during Windows reinstallation by unlinking the account or using symbolic links to isolate local data.

Read More
Force First Frame as Keyframe Without Re-encoding: A Quick Solution

Resolve inaccurate seeking and playback glitches by re-encoding video to ensure the first frame is a valid keyframe.

Read More
Find Information in Database Using WSL (Ubuntu) on Windows-10

Resolve database connection issues from WSL Ubuntu on Windows 10 by configuring client tools and network access to query remote or local servers.

Read More
Configuring a New Router with Different Networks: One Family, One Guest

Resolve IP conflicts and isolate guest traffic by configuring a second router with a distinct subnet via its WAN port.

Read More
Quickly Open Multiple Stock Websites with a Single Command

Solve the problem of manually opening multiple stock research websites by creating a single command to launch them simultaneously on Windows, macOS, or Linux.

Read More
Improved Adobe Acrobat Search Experience: Access Advanced Search with Ease

Access advanced search filters like case sensitivity and regex in Adobe Acrobat by clicking More Options in the Find bar.

Read More
Port Forwarding VM via OpenVPN: A Comprehensive Guide

Configure OpenVPN server and iptables to forward specific ports from VPN clients to a virtual machine's internal IP address.

Read More
Understanding Partitions in the 1980s: A Look Back at MS-DOS and Master Boot Record

Explains how the Master Boot Record and partition table enabled MS-DOS to manage multiple disk volumes on a single physical drive.

Read More
Windows 10 Enterprise: Keyboard Not Detected in Managed Organization with Admin Privileges

Resolve Windows 10 Enterprise keyboard detection failures caused by Group Policy restrictions, driver corruption, or USB enumeration errors.

Read More
Can't Find x86_64 Versions of Applications on MacOS arm64 (M1)

Resolve missing x86_64 app issues on M1 Macs by installing Rosetta 2 and reinstalling apps as universal binaries.

Read More
How to Hide Installation Source for an Android App

Manage Android app installation source visibility by using USB transfers or file managers to reduce browser traces and isolate data via work profiles.

Read More
Connecting Momentus 4200.2 ST9808210A Hard Drive via USB Cable

Resolve inability to access Seagate Momentus 4200.2 ST9808210A hard drive by connecting it via USB using a compatible SATA-to-USB adapter and configuring the disk in Windows.

Read More