2016-07-29 49 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)