Bash脚本将文件拖放到新位置


8

我敢肯定,我会把这个问题交给我,但是我似乎无法弄清楚。我是bash脚本的新手,所以对我轻松一点...

我希望能够将文件拖放到桌面应用程序上,然后再调用bash脚本,它将该文件移动到bash脚本内指定的位置。到目前为止,这是什么。

Bash脚本

#! /bin/bash

mv $file /path/to/new/directory

但是,$file当我将变量拖放到桌面应用程序上时,我不知道如何将其作为变量输入。我怎样才能做到这一点?

原因:我有一些文件需要在一个文件夹中阅读,一旦阅读它们,便将它们放入另一个文件夹中。我基本上只是想简化它。

谢谢保罗


2
我不明白,如果您要的话,为什么不直接拖放它们呢?您似乎在问如何将其拖动到folder1中,这将导致被拖动的项目被移动到文件夹2中。
terdon '16

2
我不知道有任何文件管理器允许您将文件拖放到应用程序上,然后将该文件传递给应用程序以执行某些操作。我使用的每个文件管理器仅支持将文件拖到文件夹中。您是否有任何理由认为这有可能?您是否看到过以这种方式工作的应用程序?您当然可以使用Web应用程序(然后提供浏览器的拖放API)或另一种更为复杂的应用程序来执行此操作,但这可能太复杂而无法在AskUbuntu答案中进行解释。
罗宾·温斯洛

1
大多数终端和文件管理器不这样做吗?在XFCE中,将文件从Thunar拖到终端上会粘贴完整的文件名。并将文件拖到LibreOffice或Gedit之类的文件中将打开它(至少尝试这样做)。听起来这完全取决于应用程序对文件名执行任何操作。
Xen2050 '16

@terdon。是的,我确实只是想拖放到另一个文件夹中,但是我想要一种快速的方法来执行此操作,而不必退出原来所在的目录并将其移到新目录中,然后将文件转储到该目录中。这对我来说似乎效率很低。对于其他所有人,请参见下面的Slug45提供的答案。
PaulFrater '16

Answers:


24
  1. 创建具有以下内容的bash脚本文件:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. 创建具有以下内容的.desktop文件:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. 根据自己的喜好更改PATH_TO_NEW_DIRECTORY和PATH_TO_SCRIPT_FILE。

  4. chmod +x script_name

  5. 将文件拖到.desktop文件。

  6. 完成!


1
应该强调的是,您总是需要引用变量,如图所示。使用$file代替"$file"(或"${file}")会使您陷入麻烦。
帕迪·兰道

另外,bash这里不需要使用;#!/bin/sh足以完成相同的工作(尽管它可能bash在许多系统上都可以链接到)。
ckujau '16

14

无需脚本。在需要的地方创建指向PATH_TO_NEW_DIRECTORY的链接。然后将文件拖到链接


2
这本来是个更简单的解决方案(但后来我对bash脚本
一无所知

这是解决问题的“明显”方法。但是,如果您使用脚本,则该脚本可能会非常复杂,并根据要传递的文件执行不同的操作-例如将音乐文件放在一个位置,将文档放在另一个位置-或仅更改目标位置而不必替换符号链接。

3

@ Slug45所说的完全正确。但是,它缺乏解释。

当您将文件拖放到可执行文件(或指向一个文件的链接)时,该可执行文件将以被拖动文件的路径作为参数运行。这在Windows上是完全相同的(不是在这里确实很重要)。

Bash有一种处理参数的简单方法。使用"$@" (带引号)获取所有参数的数组(例如,在for..in循环中很有用)。$@"$*"$*做类似的事情,但是您几乎总是想要"$@"。有关详细信息,请参见此处

此外,您可以直接访问特定的参数,$X因为X是参数编号。例如:

$ cat ./args.sh
echo $1
echo $2
echo $3
$ ./args.sh foo bar baz
foo
bar
baz
$

在大型脚本中,最好将它们分配给命名变量:

$ cat music.sh
#!/bin/bash
# Usage: ./music.sh Artist Album Song
ARTIST=$1
ALBUM=$2
SONG=$3

if [ $ARTIST -eq "Nickelback" ]; then exit; fi

mplayer ~/Music/$ARTIST/$ALBUM/$SONG.mp3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.