Bash Script для перетаскивания файла в новое место

8

Я уверен, что получу свою задницу мне за этот вопрос, но я просто не могу понять это. Я новичок в написании сценариев bash, так что будь осторожен со мной ...

Я хочу иметь возможность перетаскивать файл в настольное приложение, которое затем вызывает скрипт bash, который переместит этот файл в место, обозначенное в скрипте bash. Вот что уже есть.

Скрипт bash

#! /bin/bash

mv $file /path/to/new/directory

Однако я не могу понять, как вводить $fileпеременную, когда перетаскиваю ее в настольное приложение. Как я могу это сделать?

Причина: у меня есть документы, которые мне нужно прочитать в одной папке, и, прочитав их, я положил их в другую папку. Я просто хочу сделать это легко.

Спасибо пол

PaulFrater
источник
2
Я не понимаю, почему бы вам просто не перетащить их, если вы этого хотите? Похоже, вы спрашиваете, как перетащить в папку 1, что приведет к перемещению перетаскиваемого элемента в папку 2. Почему бы вам просто не перетащить его непосредственно в папку 2?
Тердон
2
Я не знаю ни одного файлового менеджера, который позволял бы перетаскивать файл в приложение, а затем передавать этот файл приложению, чтобы что-то сделать. Каждый используемый мной файловый менеджер поддерживает только перетаскивание файлов в папки. Есть ли у вас основания полагать, что это возможно? Вы видели приложение, которое работает таким образом? Конечно, вы можете сделать это с помощью веб-приложения (которое затем предоставляет API-интерфейс браузера для перетаскивания) или другого более сложного типа приложения, но это может быть слишком сложно, чтобы объяснить это в ответе AskUbuntu.
Робин Уинслоу
1
Разве большинство терминалов и файловых менеджеров не делают этого? В XFCE при перетаскивании файла из Thunar на терминал вставляется полное имя файла. И перетаскивание файла в нечто вроде LibreOffice или Gedit откроет его (по крайней мере, попытайтесь ). Похоже, что это полностью зависит от приложения, чтобы сделать все, что он хочет с именем файла.
Xen2050
@terdon. Да, я просто хочу перетащить в другую папку, но я хотел сделать это быстро, без необходимости возвращаться из каталога, в котором я находился, и полностью перемещаться в новый каталог, а затем выгружать туда файл. Это просто кажется мне неэффективным. Для всех остальных, смотрите ответ, предоставленный Slug45 ниже.
PaulFrater

Ответы:

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. Выполнено!.

Slug45
источник
1
Следует подчеркнуть, что вам всегда нужно заключать в кавычки переменные, как показано на рисунке. Использование $fileвместо "$file"(или "${file}") может привести к неприятностям.
Пэдди Ландау
Кроме того, нет необходимости использовать bashздесь; #!/bin/shдостаточно сделать то же самое (хотя это может быть связано с тем bashили иным способом во многих системах).
ckujau
14

Нет необходимости в сценарии. Создайте ссылку на PATH_TO_NEW_DIRECTORY, где она вам нужна. Затем перетащите файл по ссылке

Жан-Мари
источник
2
Это было бы более простым решением (но тогда я бы не узнал кое-что о скриптах bash :)
PaulFrater,
Это «очевидный» способ сделать это и ответить на вопрос. Но если вы используете сценарий, этот сценарий может быть произвольно сложным и делать разные вещи в зависимости от того, к какому файлу он передается - например, помещать музыкальные файлы в одно место и документы в другое место - или просто менять место назначения без замены символической ссылки.
Джо,
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
Дункан Х Симпсон
источник