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

Use find as usual and delimit your lines with NUL. GNU sort can handle these with the -z switch:

find . -print0 | sort -z | xargs -r0 yourcommand

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.

  • 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
  • There is also the -t \0 option for sort (which is a -z synonym) – Javier Aug 10 '15 at 18:44
  • 1
    The problem with all these |sort solutions is that you cannot use -exec any longer. OK, although it is possible to rewrite your statement given to -exec so that it works with xargs, the question is, what about "mini-scripts"? (sh -c ...) I wouldn't call that trivial to transform a 'sh -c' mini-script with multiple commands so that it can work with xargs (if possible at all, that is) – syntaxerror Nov 20 '15 at 19:57
  • @syntaxerror: What problem do you have using sh -c with xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x – Roger Pate Aug 24 '16 at 18:11

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

  • 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

If you have GNU Parallel http://www.gnu.org/software/parallel/ installed you can do this:

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

You can install GNU Parallel simply by:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Watch the intro videos for GNU Parallel to learn more: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.