2016-07-29 51 views
0

我希望在cli中复制文件并将其与ctrl + v粘贴到文件资源管理器中,我发现下面的java代码可以做到这一点,如何在linux shell中做到这一点?如何模拟ctrl + c在bash中复制文件

public static void putFileToSystemClipboard(final File fileOut) throws Exception { 
     final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     final ClipboardOwner clipboardOwner = null; 

     final Transferable transferable = new Transferable() { 
      public boolean isDataFlavorSupported(final DataFlavor flavor) { 
       return false; 
      } 
      public DataFlavor[] getTransferDataFlavors() { 
       return new DataFlavor[] { DataFlavor.javaFileListFlavor, DataFlavor.stringFlavor }; 
      } 
      public Object getTransferData(final DataFlavor flavor) { 
       if (flavor.equals(DataFlavor.javaFileListFlavor)) { 
        final List<String> list = new ArrayList<>(); 
        list.add(fileOut.getAbsolutePath()); 
        return list; 
       } 
       if (flavor.equals(DataFlavor.stringFlavor)) { 
        return fileOut.getAbsolutePath(); 
       } 
       return null; 
      } 
     }; 
     clipboard.setContents(transferable, clipboardOwner); 
    } 
+0

http://superuser.com/questions/288320/whats-like-osxs-pbcopy-for-linux – ewcz

+0

@ewcz,我知道xclip,但我只把字符串放到剪贴板,看我的java代码,我把文件放到我的剪贴板上,然后我可以在文件资源管理器中粘贴(ctrl + v),这就是diff – asullaherc

+0

据我了解你的代码,它把绝对路径放在剪贴板?在这种情况下,可能是'readlink -f your_file | xclip -selection clipboard' should work - here'readlink -f'返回'your_file'的绝对路径... – ewcz

回答

0

我找到了解决办法:

在下面的代码复制短

运行

“/ tmp目录/文件到夹/水木清华”,然后我可以按Ctrl + V键粘贴在Thunar中

public class FileToClip { 
    public static void main(final String[] args) throws Exception { 
     final File file = new File("/tmp/file-to-clip/smth"); 
     System.out.println("copy " + file.toString()); 
     new FileToClip().toClip(file); 

     Thread.sleep(Long.MAX_VALUE); 
    } 

    public void toClip(final File f) throws Exception { 
     final Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     final ClipboardOwner clipboardOwner = null; 

     final Transferable transferable = new Transferable() { 
      public boolean isDataFlavorSupported(final DataFlavor flavor) { 
       return false; 
      } 

      public DataFlavor[] getTransferDataFlavors() { 
       return new DataFlavor[]{DataFlavor.javaFileListFlavor, DataFlavor.stringFlavor, gcf}; 
      } 

      public Object getTransferData(final DataFlavor flavor) { 
       if (flavor.equals(DataFlavor.javaFileListFlavor)) { 
        final List<String> list = new ArrayList<>(); 
        list.add(f.getAbsolutePath()); 
        return list; 
       } 

       if (flavor.equals(DataFlavor.stringFlavor)) { 
        return f.getAbsolutePath(); 
       } 

       if (flavor.equals(gcf)) { 
        String p = "copy\n" + 
          "file://" + f.getAbsolutePath(); 
        return new ByteArrayInputStream(p.getBytes(Charset.forName("UTF-8"))); 
       } 
       return null; 
      } 
     }; 
     clip.setContents(transferable, clipboardOwner); 
    } 

    DataFlavor gcf = createDataFlavor("x-special/gnome-copied-files", null, true); 

    public static DataFlavor createDataFlavor(@NotNull final String mimeType, @Nullable final Class<?> klass, final boolean register) { 
     try { 
      final DataFlavor flavor = 
        klass != null ? new DataFlavor(mimeType + ";class=" + klass.getName(), null, klass.getClassLoader()) : new DataFlavor(mimeType); 

      if (register) { 
       final FlavorMap map = SystemFlavorMap.getDefaultFlavorMap(); 
       if (map instanceof SystemFlavorMap) { 
        ((SystemFlavorMap) map).addUnencodedNativeForFlavor(flavor, mimeType); 
       } 
      } 

      return flavor; 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

查看详细

所有代码可以在IntelliJ IDEA的this source file(见#getTransferData)

  • 如何找到的DataFlavor如 “x-特殊/ GNOME-复制,文件” 中找到? 根据man xclip

-t,-target

使用给定的目标原子指定一个特定的数据格式。使用-o特殊的目标原子名称“TARGETS”可以用来获得这个选择的有效目标原子列表。有关的靶原子的更多信息请参见ICCCM 2.6.2节

所以我可以做以下来获得目标(在Java中的DataFlavor)

  • 命中CTRL + C在GUI(文件浏览器,或者代码IDE)
  • XCLIP -selection剪贴板-o -t目标

输出像以下:

UTF8_STRING 
TEXT 
STRING 
text/plain;charset=UTF-16 
text/plain;charset=UTF-8 
text/plain;charset=UTF-16BE 
text/plain;charset=UTF-16LE 
text/plain;charset=ISO-8859-1 
text/plain;charset=US-ASCII 
text/plain 
FILE_NAME 
text/uri-list 
text/uri-list;charset=UTF-16 
text/uri-list;charset=UTF-8 
text/uri-list;charset=UTF-16BE 
text/uri-list;charset=UTF-16LE 
text/uri-list;charset=ISO-8859-1 
text/uri-list;charset=US-ASCII 
x-special/gnome-copied-files 

回到我的问题,如果我在命令行复制文件,并将其粘贴在GUI中,我需要

  • 化妆摆动或JavaFX的后台程序(含通知图标)
  • CLI控制此应用程式在系统启动时插座
  • 让应用自动启动(大多数Linux有这个FUNC)