Execute command on files with spaces in Bash

Posted on January 1, 2015

All UNIX users have a love for batch-processing files. I had to do some processing on a few hundred different files. However some of the people who submitted the files, sadly, used filenames with spaces in them. Usually one would do something like this:

for file in *.txt; do
    cat file
done;

But since bash (or the much better zsh) will split using whitespaces, files with spaces will not be processed properly. I looked further and thought maybe the xargs command will do the trick:

find . -name "*.txt" | xargs -I file cat file

But filenames with spaces in them still do not work. After some heavy researching, and reading long man pages I found the following solution:

find . -name "*.txt" -print0 | xargs -0 -I file cat file 

This will separate each filename with the null character, thus allowing xargs to process filenames with whitespaces in them!

blog comments powered by Disqus