Bash Script per trascinare e rilasciare un file in una nuova posizione


8

Sono sicuro che mi porterò il culo per questa domanda, ma non riesco proprio a capirlo. Sono nuovo di bash scripting, quindi andate piano con me ...

Voglio essere in grado di trascinare e rilasciare un file su un'applicazione desktop, che quindi chiama uno script bash che sposta il file in una posizione designata all'interno dello script bash. Ecco cosa ho finora.

Bash script

#! /bin/bash

mv $file /path/to/new/directory

Tuttavia, non riesco a capire come inserire la $filevariabile come quando la trascino su un'applicazione desktop. Come posso fare questo?

Motivo: ho dei documenti che devo leggere in una cartella e, una volta letti, li inserisco in un'altra cartella. Fondamentalmente voglio solo renderlo facile.

Grazie Paul


2
Non capisco, perché non trascinarli e rilasciarli se è quello che vuoi? Sembra che ti stia chiedendo come trascinare nella cartella1 che provocherà lo spostamento dell'elemento trascinato nella cartella 2. Perché non trascinarlo direttamente nella cartella2 in primo luogo?
terdon,

2
Non conosco alcun file manager che ti consenta di trascinare e rilasciare un file su un'applicazione, quindi passare quel file all'applicazione per fare qualcosa. Ogni file manager che ho usato supporta solo il trascinamento di file in cartelle. Hai qualche motivo per pensare che questo potrebbe essere possibile? Hai visto un'applicazione che funziona in questo modo? Ovviamente potresti farlo con un'applicazione web (che fornisce quindi l'API di trascinamento della selezione del browser) o un altro tipo di applicazione più complessa, ma potrebbe essere troppo complesso per essere spiegato in una risposta AskUbuntu.
Robin Winslow,

1
La maggior parte dei terminali e dei file manager non lo fa? In XFCE, trascinando un file da Thunar su un terminale si incolla il nome file completo. E trascinando un file su qualcosa come LibreOffice o Gedit lo aprirai (almeno provaci a). Sembra che spetti all'applicazione fare tutto ciò che vuole con il nome file.
Xen2050,

@terdon. Sì, voglio solo trascinare e rilasciare in un'altra cartella, ma volevo un modo rapido per farlo senza dover uscire dalla directory in cui mi trovavo e spostarmi completamente in una nuova directory e quindi scaricare il file lì. Questo sembra inefficiente per me. A tutti gli altri, vedi la risposta fornita da Slug45 di seguito.
PaulFrater

Risposte:


24
  1. Crea un file di script bash con i seguenti contenuti:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. Creare un file .desktop con i seguenti contenuti:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. Cambia PATH_TO_NEW_DIRECTORY e PATH_TO_SCRIPT_FILE a tuo piacimento.

  4. Fare chmod +x script_name

  5. Trascina i file nel file .desktop.

  6. Fatto!.


1
Va sottolineato che è sempre necessario citare le variabili, come mostrato. L'uso al $fileposto di "$file"(o "${file}") può metterti nei guai.
Paddy Landau,

Inoltre, non è necessario utilizzare bashqui; #!/bin/shè sufficiente fare lo stesso (anche se può essere bashcomunque collegato a molti sistemi).
ckujau,

14

Non c'è bisogno di una sceneggiatura. Crea un link a PATH_TO_NEW_DIRECTORY dove ne hai bisogno. Quindi trascina il file sul link


2
Questa sarebbe stata una soluzione più semplice (ma poi non avrei imparato qualcosa sullo scripting bash :)
PaulFrater

Questo è il modo "ovvio" per farlo e risponde alla domanda. Ma, se usi uno script, quello script può essere arbitrariamente complesso e fare cose diverse a seconda del file che viene passato - come mettere i file musicali in un posto e documenti in un altro posto - o semplicemente cambiare la destinazione senza dover sostituire il link simbolico.
Joe,

3

Quello che ha detto @ Slug45 è completamente corretto. Tuttavia, manca una spiegazione.

Quando si trascina e rilascia un file su un file eseguibile (o un collegamento a uno), tale eseguibile viene eseguito con il percorso del file trascinato come argomento. Questo è esattamente lo stesso su Windows (non che qui conta davvero).

Bash ha un modo semplice di trattare gli argomenti. Utilizzare "$@" (con le virgolette) per ottenere una matrice di tutti gli argomenti (utile ad esempio in un ciclo for..in). $@, "$*"e $*fai cose simili, ma quasi sempre lo desideri "$@". Vedi qui per maggiori informazioni sui dettagli.

Inoltre, puoi accedere direttamente ad argomenti specifici come $Xdove X è il numero arg. Per esempio:

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

In script di grandi dimensioni, è meglio assegnare quelli alle variabili con nome:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.