Bash 脚本:识别拖放到 konsole 的路径

Posted

技术标签:

【中文标题】Bash 脚本:识别拖放到 konsole 的路径【英文标题】:Bash script: Recognizing paths drag-and-dropped to konsole 【发布时间】:2015-11-10 15:11:21 【问题描述】:

我正在寻找可以将 Windows 用户目录中的用户文件复制到备份驱动器的脚本。我几乎希望转移除 Appdata 之外的所有内容。我做了一个非常简单的脚本,但由于我要转移的文件夹名称中有空格(例如'/media/gage/Backup\ Drive/'),它说Drive' 不存在。

我正在尝试将目录从文件管理器拖放/粘贴到终端上,一旦我将它拖过来,它就会在整个路径周围出现's。有没有办法让输入识别带有's 的文件名?

这是我目前所拥有的(我真的是 bash 脚本的新手)

#!/bin/bash
echo "Enter the full path to the user's directory"
read srcName
echo "Enter the full path to the backup directory"
read dstName
echo "Copying from Users to Backup"
cd $srcName
cp -rp Documents $dstName
cp -rp Pictures $dstName
cp -rp Desktop $dstName
cp -rp Music $dstName
cp -rp Videos $dstName
cp -rp Downloads $dstName
cp -rp Favorites $dstName

感谢任何帮助

谢谢。

【问题讨论】:

这些名字的开头和结尾都没有's;引号是句法,而不是文字。 顺便说一句,shellcheck.net 会为您捕捉到这一点,而无需任何人参与。 另外,使用 IFS= read -r srcNameIFS= read -r dstName... 那就是:srcName=$1; dstName=$2 ...然后,您将在输入命令名称后,但在按 Enter 运行它之前,拖放路径。 【参考方案1】:

终端早于拖放和复制粘贴,因此两者都没有以稳健的方式集成。由每个终端仿真器决定要做什么。

当您从图形文件管理器拖放一个或多个文件时,一些常见的反应如下:

xterm 什么都不做。

gnome-terminal 假装您将路径键入为空格分隔、shell 转义的单词,每个单词都完全是单引号并带有适当的转义:

'/path/foo' '/path/Rock Lobster - B-52'\''s.mp3'

konsole 弹出一个菜单,让您选择复制/移动到 shell 的当前目录,或者将路径粘贴为 shell 转义词,如果它们包含元字符,则只有单引号:

/path/foo '/path/Rock Lobster - B-52'\''s.mp3'

根据您的描述,您使用的是gnome-terminal,只是没有尝试拖放包含单引号的文件来查看它对文件名的其他作用。


那你能做什么?

我建议您只要求逐字复制粘贴路径,而不是拖放文件。这就是所有其他程序的工作方式,以及您可以使用 Charles Duffy 的解决方案来做什么。

要将路径复制粘贴为字符串而不是拖动文件,通常可以在文件管理器中打开“属性”或“详细信息”选项卡,然后从那里复制完整路径。

不过,为了好玩,如果您真的愿意,可以通过以下方式将输入解释为从文件管理器拖放的文件,方法是使用 eval 填充数组:

#!/bin/bash    
echo "Drag&Drop files/dirs and press enter when done."
echo "Do not drag&drop/paste/type text, because it will be evaluated as code."
IFS="" read -r input
eval "files=( $input )"

echo "Here are the things you pasted:"
for file in "$files[@]"
do
  ls -ld "$file"
done

运行如下:

$ ./test
Drag&Drop files/dirs and press enter when done.
Do not drag&drop/paste/type text, because it will be evaluated as code.
'/usr/local/home/me/Documents' '/usr/local/home/me/Downloads'

Here are the things you pasted:
drwxr-x--- 3 me eng 4096 Aug  7 13:46 /usr/local/home/me/Documents
drwxr-x--- 2 me eng 4096 Aug 17 14:32 /usr/local/home/me/Downloads

【讨论】:

啊!我完全错过了那里的推理。混乱的解决方案,但是,是的,考虑到上下文是有道理的。 几乎想编辑问题以更明确地了解复制和粘贴方面。 我会毫不犹豫地这样做。而我没有。 我正在使用 Konsole,我也安装了 gnome-terminal。 更新了标题,使其更加明确(有点),并删除了我的答案。

以上是关于Bash 脚本:识别拖放到 konsole 的路径的主要内容,如果未能解决你的问题,请参考以下文章

将拖放文件拖放到 Python 脚本上

将 UIView 拖放到另一个(UIPanGesture 识别器)中

将文件路径拖放到 Java Swing JTextField

简单拖放到窗口返回文件路径

如何在 OS X 上拖放到 (python) 脚本上?

如何将外部文件拖放到我的 xojo 应用程序并返回路径