Take the 2-minute tour ×

I need to be able to alphabetically sort the output of find before piping it to a command. Entering | sort | between didn't work, so what could I do?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand
share|improve this question

4 Answers 4

up vote 6 down vote accepted

Leave the newlines in (just a standard -print), then sort, then remove the newlines:

find | sort | sed ':a;N;$!ba;s/\n/ /g' | xargs -0 yourcommand
share|improve this answer
One of the reasons for using -print0 is in case of embedded whitespace. Converting the newlines to spaces will just compound the problem. –  Arcege Mar 16 '12 at 12:02

Some versions of sort have a -z option, which allows for null-terminated records.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Additionally, you could also write a high-level script to do it:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Add the -r option to xargs to make sure that myCommand is called with an argument.

share|improve this answer
Good one (two?)... Interestingly, though, the two methods handle . differently... With sort it winds up at the end of the list... with python it sorts to the top. (maybe python sorts with LC_COLLATE=C) –  Peter.O Mar 16 '12 at 14:45


find folder1 folder2 -name "*.txt" -print | sort | parallel myCommand

You can install GNU Parallel simply by:

chmod 755 parallel
cp parallel sem


share|improve this answer
What is the justification for using GNU Parallel? To speed it up? –  Peter Mortensen Sep 28 at 0:18
That and you do not need to mess with \0 separated records. –  Ole Tange Sep 28 at 16:46

I think you need the -n flag for sort#

According to man sort:

-n, --numeric-sort
    compare according to string numerical value


The print0 may have something to do with this, I just tested this. Take the print0 out, you can null terminate the string in sort using the -z flag

share|improve this answer
Well, that print0 appears to be space-separating the filenames which is what I need to pass to my command, unfortunately –  Industrial Mar 16 '12 at 10:46

Your Answer


