Encode a String to be used as shell argument

Had the same problem, single quotes wasn't sufficient (as already pointed out by Robert)

Solution:

import com.google.common.escape.Escaper;
import com.google.common.escape.Escapers;

public class YourFancyClass {
    public static final Escaper SHELL_ESCAPE;
    static {
        final Escapers.Builder builder = Escapers.builder();
        builder.addEscape('\'', "'\"'\"'");
        SHELL_ESCAPE = builder.build();
    }
}

Why such an awfully complex replacement? That's why.

Use case:

System.out.format("ln -f '%s' '%s'%n", 
    SHELL_ESCAPE.escape(anyOrig.toString()),
    SHELL_ESCAPE.escape(duplicate.toString()));

Works as intended:

ln -f '/home/user/Musik/mix-2012-13/aesthesys~ I Am Free, That Is Why I'"'"'m Lost..mp3' '/home/user/Musik/youtube converted/aesthesys~ I Am Free, That Is Why I'"'"'m Lost..mp3'

How about using the Exec module from Apache Commons? It includes a commandline builder. Also be aware that if the filename is retrieved from user input, you should be very careful with executing commands with the user input as a program argument. Escaping improperly may lead to execution of additional commands (unless the commons module is used I guess).