Script Bash para arrastar e soltar um arquivo no novo local

8

Tenho certeza de que vou me entregar para esta pergunta, mas não consigo entender. Eu sou novo em bash scripts, então vá com calma comigo ...

Quero poder arrastar e soltar um arquivo em um aplicativo da área de trabalho, que chama um script bash que moverá esse arquivo para um local designado no script bash. Aqui está o que tem até agora.

Script Bash

#! /bin/bash

mv $file /path/to/new/directory

No entanto, não consigo descobrir como inserir a $filevariável como quando a arrasto e solto em um aplicativo de desktop. Como posso fazer isso?

Motivo: tenho papéis que preciso ler em uma pasta e, depois de lê-los, coloco-os em outra pasta. Basicamente, só quero facilitar isso.

Obrigado Paul

PaulFrater
fonte
2
Eu não entendo, por que você simplesmente não os arrasta e solta se é isso que você quer? Você parece estar perguntando como arrastar para a pasta1, o que fará com que o item arrastado seja movido para a pasta 2. Por que você simplesmente não o arrasta diretamente para a pasta2?
terdon
2
Não conheço nenhum gerenciador de arquivos que permita arrastar e soltar um arquivo em um aplicativo e depois passá-lo para o aplicativo para fazer alguma coisa. Todo gerenciador de arquivos que usei suporta apenas arrastar arquivos para pastas. Você tem algum motivo para pensar que isso é possível? Você viu um aplicativo que funciona dessa maneira? Obviamente, você pode fazer isso com um aplicativo da Web (que fornece a API de arrastar e soltar do navegador) ou outro tipo de aplicativo mais complexo, mas que pode ser complexo demais para explicar em uma resposta do AskUbuntu.
224166 Robin Winslow
1
A maioria dos terminais e gerenciadores de arquivos não faz isso? No XFCE, arrastar um arquivo de Thunar para um terminal cola o nome do arquivo completo. E arrastar um arquivo para algo como LibreOffice ou Gedit o abrirá (pelo menos tente ). Parece que o aplicativo pode fazer o que quiser com o nome do arquivo.
Xen2050 04/04
@terdon. Sim, eu só quero arrastar e soltar em outra pasta, mas eu queria uma maneira rápida de fazer isso sem precisar sair do diretório em que estava e passar todo o caminho para um novo diretório e depois despejar o arquivo lá. Isso apenas parece ineficiente para mim. Para todos os outros, veja a resposta fornecida por Slug45 abaixo.
precisa saber é o seguinte

Respostas:

24
  1. Crie um arquivo de script bash com o seguinte conteúdo:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. Crie um arquivo .desktop com o seguinte conteúdo:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. Mude PATH_TO_NEW_DIRECTORY e PATH_TO_SCRIPT_FILE ao seu gosto.

  4. Faz chmod +x script_name

  5. Arraste os arquivos para o arquivo .desktop.

  6. Feito!.

Slug45
fonte
1
Deve-se enfatizar que você sempre precisa citar as variáveis, como mostrado. Usar em $filevez de "$file"(ou "${file}") pode causar muitos problemas.
Paddy Landau
Além disso, não há necessidade de usar bashaqui; #!/bin/shé suficiente fazer o mesmo (embora possa estar vinculado de bashqualquer maneira em muitos sistemas).
Ckujau
14

Não há necessidade de um script. Crie um link para PATH_TO_NEW_DIRECTORY onde você precisar. Em seguida, arraste o arquivo para o link

Jean-Marie
fonte
2
Esta teria sido uma solução mais fácil (mas então eu não teria aprendido algo sobre bash script :)
PaulFrater
Esta é a maneira "óbvia" de fazê-lo e responde à pergunta. Mas, se você usar um script, esse script pode ser arbitrariamente complexo e fazer coisas diferentes, dependendo de qual arquivo é passado - como colocar arquivos de música em um local e documentos em outro local - ou apenas alterar o destino sem precisar substituir o link simbólico.
Joe
3

O que o @ Slug45 disse está completamente correto. No entanto, falta uma explicação.

Quando você arrasta e solta um arquivo em um arquivo executável (ou um link para um), esse executável é executado com o caminho para o arquivo arrastado como argumento. Isso é exatamente o mesmo no Windows (não que isso realmente importe aqui).

Bash tem uma maneira simples de lidar com argumentos. Use "$@" (com as aspas) para obter uma matriz de todos os argumentos (útil por exemplo em um loop for..in). $@,, "$*"e $*faça coisas semelhantes, mas você quase sempre deseja "$@". Veja aqui para mais informações sobre os detalhes.

Além disso, você pode acessar diretamente argumentos específicos, $Xonde X é o número do argumento. Por exemplo:

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

Em scripts grandes, é melhor atribuir aqueles a variáveis ​​nomeadas:

$ 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
Duncan X Simpson
fonte