The find Command and xargs: Batch Operations Safely
Search files by name, size, and age with find, and pipe results to xargs for safe batch operations.
Netbay Developer Relations
Netbay Engineering
On this page
The find command locates files and directories matching precise criteria, and xargs converts that list into actions. Together they automate cleanup, archiving, and bulk administration that would otherwise require dozens of manual commands. Used carelessly, however, both can destroy data. This guide shows how to master them safely.
Searching with find
The basic syntax is find PATH EXPRESSION. Common expressions filter by name, type, size, and modification time:
find /var/log -name "*.log" -mtime +7
find /tmp -type f -size +100M
find /home -type d -name "node_modules"
find /var/www -type f -newermt "2026-01-01" ! -name "*.tmp"The first finds log files older than seven days. The second lists files over 100 megabytes in /tmp. The third locates node_modules directories. The fourth finds files modified this year, excluding temporary files.
You can format the output and perform actions directly:
find /data -type f -name "*.tar.gz" -printf "%p %s bytes\n"
find /var/log -name "*.log" -deleteThe -printf flag gives precise control over output formatting. The -delete action removes matching files, which is powerful and dangerous, so always test with -print first.
Performing Actions Inline
find can run a command on each match using -exec:
find /backups -type f -mtime +30 -exec rm {} \;
find /var/www -type d -exec chmod 755 {} \;
find /tmp -type f -mmin +60 -exec gzip {} \;The {} placeholder stands for each matched file, and the \; terminates the command. In the shell this is a semicolon escaped as backslash-semicolon. The third runs gzip on each file edited more than 60 minutes ago.
The dollar-brace form is NOT used here. The {} in -exec is a find placeholder, completely unrelated to shell variable expansion. If you name a script with braces, use quotes to avoid the shell touching it.
Why xargs Is Different
xargs reads items from standard input and runs a command with as many items as fit per invocation:
find /var/log -name "*.log" -mtime +7 | xargs rm
find /projects -name "package.json" | xargs -n1 dirname
find /data -type f -size +500M -print0 | xargs -0 du -hThe -n1 flag runs the command once per input item, which matters for commands that accept only one argument. du -h reports the size of each large file.
The critical safety issue is filenames with spaces or newlines. By default, xargs splits input on whitespace, so a file named "my report.pdf" would be split incorrectly. The robust solution is the null-separated form:
find . -type f -print0 | xargs -0 rm-print0 emits a null byte after each path, and -0 tells xargs to split on null bytes. This handles any filename safely.
Protecting Filenames with Spaces
Without -print0, a file containing a space is treated as two arguments. Consider a backup directory with the file "config 2026.tar.gz":
find /backups -type f -exec du -h {} \; # safe
find /backups -type f | xargs du -h # risky with spaces
find /backups -type f -print0 | xargs -0 du -h # safeThe -exec form is inherently safe because find quotes each argument itself. The pipe-to-xargs form is only safe with -print0 plus -0.
Batch Compression and Permissions Example
A real-world batch operation: compress all access logs older than a week and clean up test reports. Run with -print first, then execute:
find /var/log -name "access.log.*" -mtime +7 -print0 | xargs -0 gzip
find /var/www -type f -name "*.html" -not -newermt "2026-01-01" -exec rm {} \;Test every destructive command by first running a harmless variant such as find ... -print or find ... -exec echo {} \;. Only when you are certain of the matches should you switch echo to the destructive action.
Takeaway
find and xargs are the workhorses of file automation, but they punish mistakes hard. Verify with -print first, prefer null-separated input with spaces, and reserve destructive actions until you confirm the output. Automate your file cleanup on a Netbay Linux VPS with these tools at netbayhosts.in.
Keep reading
Follow along on a real VPS
Deploy Linux in under 60 seconds
These guides are written against Ubuntu, Debian, and RHEL-family images — the same ones on NetBay.
Deploy an instance