首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash中模拟ctrl+c复制文件

如何在bash中模拟ctrl+c复制文件
EN

Stack Overflow用户
提问于 2016-07-29 13:16:29
回答 1查看 374关注 0票数 0

我希望复制cli中的文件条目,并在文件资源管理器中使用ctrl+v粘贴它,我发现以下java代码可以做到这一点,如何在linux shell中做到这一点?

代码语言:javascript
复制
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);
    }
EN

回答 1

Stack Overflow用户

发布于 2016-07-29 19:43:40

我找到了解决方案:

短中的

运行以下代码将复制"/tmp/file- to -clip/smth“,然后我可以点击ctrl+v将其粘贴到Thunar中

代码语言:javascript
复制
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);
        }
    }
}

detail

所有代码都可以在intellij idea this source file中找到(参见#getTransferData)

  • 如何找到像“x-special/gnome-copied files”这样的数据?根据man xclip

-t,-target

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

因此,我可以执行以下操作来获取目标(java中的dataflavor)

  • 在图形用户界面(文件资源管理器或代码ide)中命中ctrl+c
  • xclip -selection剪贴板-o -t目标

输出如下:

代码语言:javascript
复制
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

返回到我的问题,如果我在cli中复制文件并将其粘贴到gui中,我需要

  • 生成swing或javafx后台应用程序(带通知图标)
  • cli使用套接字控制此应用程序
  • 使应用程序在系统启动时自动启动(大多数linux具有此功能)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38650970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档