Day 38intermediateMar 10, 2026

Process Lists in Parallel with xargs

xargs with -P turns sequential operations into parallel ones, dramatically cutting processing time.

linuxperformanceautomation
Share:

What

xargs takes input from stdin and converts it into arguments for a command. With the -P flag, it can run multiple processes in parallel, dramatically speeding up batch operations. Combined with -I {} for placeholder substitution, xargs becomes a simple but powerful parallel processing engine.

Why It Matters

Processing thousands of files, URLs, or records one at a time is painfully slow. xargs -P lets you utilize multiple CPU cores without writing complex parallel scripts. It can turn a 30-minute sequential task into a 5-minute parallel one with a single flag β€” depending on the workload.

Example

# Compress all log files using 4 parallel processes
find . -name "*.log" -print0 | xargs -0 -P 4 gzip

# Download multiple files in parallel (8 at a time)
cat urls.txt | xargs -P 8 -I {} curl -sO {}

# Delete thousands of old temp files efficiently
find /tmp -type f -mtime +30 -print0 | xargs -0 -P 4 rm -f

# Run a script on multiple servers in parallel
cat servers.txt | xargs -P 10 -I {} ssh {} 'uptime'

# Convert images in parallel with ImageMagick
find . -name "*.png" -print0 | xargs -0 -P $(nproc) -I {} sh -c 'convert "$1" -resize 50% "resized-$(basename "$1")"' _ {}
bash

Common Mistake

Not using -print0 with find and -0 with xargs when filenames contain spaces, quotes, or special characters. Without null-byte delimiters, filenames like 'my file (copy).log' break into multiple arguments and cause errors.

Quick Fix

Always pair find -print0 with xargs -0 for safe filename handling. This uses null bytes instead of whitespace as delimiters, handling any filename correctly: find . -name '*.log' -print0 | xargs -0 -P 4 gzip.

Key Takeaways

  • 1xargs converts stdin into command arguments β€” perfect for batch operations
  • 2Use -P N to run N processes in parallel (e.g., -P 4 for 4 cores)
  • 3Use -I {} as a placeholder: xargs -I {} mv {} /backup/
  • 4Always pair find -print0 with xargs -0 for safe filename handling
  • 5Use $(nproc) to automatically match your CPU core count

Was this tip helpful?

Help us improve the DevOpsPath daily collection

Share: