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 srcName
和 IFS= 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 的路径的主要内容,如果未能解决你的问题,请参考以下文章
将 UIView 拖放到另一个(UIPanGesture 识别器)中