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).