How can I handle spaces in file names when using xargs on find results?
Solution 1
Use
find ... -print0 | xargs -0 ...
e.g.
find /path/to -name "*.html" -print0 | xargs -0 grep -l "rumpus"
from the find man page
-print0
True; print the full file name on the standard output, followed
by a null character (instead of the newline character that
‘-print’ uses). This allows file names that contain newlines or
other types of white space to be correctly interpreted by pro-
grams that process the find output. This option corresponds to
the ‘-0’ option of xargs.
Solution 2
You do not need to use xargs, because find can execute commands itself. When doing this, you do do not have to worry about the shell interpreting characters in the name.
find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +
from the find man page
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of `{}' is allowed within the command. The command is executed in the starting directory.
Solution 3
If find and xarg versions on your system doesn't support -print0
and -0
switches (for example AIX find and xargs) you can use this:
find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"
Here sed will take care of escaping the spaces for xargs.
Related videos on Youtube
abeger
Updated on September 18, 2022Comments
-
abeger over 1 year
One of my common practices is to perform greps on all files of a certain type, e.g., find all the HTML files that have the word "rumpus" in them. To do it, I use
find /path/to -name "*.html" | xargs grep -l "rumpus"
Occasionally,
find
will return a file with a space in its name such asmy new file.html
. Whenxargs
passed this togrep
, however, I get these errors:grep: /path/to/bad/file/my: No such file or directory grep: new: No such file or directory grep: file.html: No such file or directory
I can see what's going on here: either the pipe or the
xargs
is treating the spaces as delimiters between files. For the life of me, though, I can't figure out how to prevent this behavior. Can it be done withfind
+xargs
? Or do I have to use an entirely different command? -
user9517 almost 13 yearsI would upvote this but I have non left for today - I'll do it tomorrow.
-
Eduardo Ivanec almost 13 years@Iain - there you go (I agree, by the way).
-
Scott M. over 8 yearsThis helped me because I had a long list of file names that was difficult to produce that I used several times. I can't just go
find
them all again. -
TransferOrbit almost 4 yearsWhat do the single quotes do in
'{}'
? I don’t see any difference in results when I exclude them.