对要用作shell参数的String进行编码

Rog*_*ach 5 java shell escaping

我需要在linux shell命令中使用文件名作为参数.问题是,java给了我这个名字,保存了所有空格和其他字符,因此shell抱怨.有没有一种方法可以在将字符串传递给shell之前转义所有有问题的字符?

Mik*_*rge 10

有同样的问题,单引号是不够的(罗伯特已经指出)

解:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这么复杂的替代?这就是为什么.

使用案例:

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

按预期工作:

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'
Run Code Online (Sandbox Code Playgroud)