Script Bash pour faire glisser et déposer un fichier vers un nouvel emplacement

8

Je suis sûr que je vais me faire remettre le cul pour cette question, mais je n'arrive pas à le comprendre. Je suis nouveau dans les scripts bash, alors allez-y doucement avec moi ...

Je veux pouvoir faire glisser et déposer un fichier sur une application de bureau, qui appelle ensuite un script bash qui déplacera ce fichier vers un emplacement désigné dans le script bash. Voici ce que nous avons jusqu'à présent.

Script bash

#! /bin/bash

mv $file /path/to/new/directory

Cependant, je ne peux pas comprendre comment saisir le en $filetant que variable lorsque je le fais glisser et le déposer sur une application de bureau. Comment puis-je faire ceci?

Raison: J'ai des papiers que je dois lire dans un dossier, et une fois que je les ai lus, je les mets dans un autre dossier. Je veux simplement vous faciliter la tâche.

Merci, Paul

PaulFrater
la source
2
Je ne comprends pas, pourquoi ne pas les glisser-déposer si c'est ce que tu veux? Vous semblez demander comment faire glisser dans le dossier1, ce qui entraînera le déplacement de l'élément glissé dans le dossier 2. Pourquoi ne le faites-vous pas simplement glisser directement dans le dossier2 en premier lieu?
terdon
2
Je ne connais aucun gestionnaire de fichiers qui vous permet de glisser-déposer un fichier sur une application, puis de le transmettre à l'application pour faire quelque chose. Chaque gestionnaire de fichiers que j'ai utilisé ne prend en charge que le déplacement de fichiers dans des dossiers. Avez-vous des raisons de penser que cela pourrait être possible? Avez-vous vu une application qui fonctionne de cette façon? Vous pouvez bien sûr le faire avec une application Web (qui fournit ensuite l'API glisser-déposer du navigateur), ou un autre type d'application plus complexe, mais cela peut être trop complexe à expliquer dans une réponse AskUbuntu.
Robin Winslow
1
La plupart des terminaux et gestionnaires de fichiers ne font-ils pas cela? Dans XFCE, faire glisser un fichier de Thunar sur un terminal colle le nom de fichier complet. Et faire glisser un fichier vers quelque chose comme LibreOffice ou Gedit l'ouvrira ( essayez au moins ). Il semble que c'est à l'application de faire tout ce qu'elle veut avec le nom de fichier.
Xen2050
@terdon. Oui, je veux simplement faire un glisser-déposer dans un autre dossier, mais je voulais un moyen rapide de le faire sans avoir à quitter le répertoire dans lequel j'étais et à me déplacer complètement dans un nouveau répertoire, puis à y vider le fichier. Cela me semble tout simplement inefficace. Pour tous les autres, voir la réponse fournie par Slug45 ci-dessous.
PaulFrater

Réponses:

24
  1. Créez un fichier script bash avec le contenu suivant:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. Créez un fichier .desktop avec le contenu suivant:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. Modifiez PATH_TO_NEW_DIRECTORY et PATH_TO_SCRIPT_FILE à votre convenance.

  4. Faire chmod +x script_name

  5. Faites glisser les fichiers vers le fichier .desktop.

  6. Terminé!.

Slug45
la source
1
Il convient de souligner que vous devez toujours citer les variables, comme indiqué. Utiliser $fileau lieu de "$file"(ou "${file}") peut vous causer des ennuis.
Paddy Landau
Aussi, pas besoin d'utiliser bashici; #!/bin/shsuffit de faire de même (bien qu'il puisse être lié à de bashtoute façon sur de nombreux systèmes).
ckujau
14

Pas besoin de script. Créez un lien vers PATH_TO_NEW_DIRECTORY où vous en avez besoin. Faites ensuite glisser le fichier vers le lien

Jean-Marie
la source
2
Cela aurait été une solution plus simple (mais je n'aurais alors rien appris sur les scripts bash :)
PaulFrater
C'est la manière "évidente" de le faire et répond à la question. Mais, si vous utilisez un script, ce script peut être arbitrairement complexe et faire différentes choses en fonction du fichier qu'il transmet - comme placer les fichiers musicaux à un endroit et les documents à un autre endroit - ou simplement changer la destination sans avoir à remplacer le lien symbolique.
Joe
3

Ce que @ Slug45 a dit est tout à fait correct. Cependant, il manque une explication.

Lorsque vous faites glisser et déposez un fichier sur un fichier exécutable (ou un lien vers celui-ci), cet exécutable est exécuté avec le chemin d'accès au fichier glissé comme argument. C'est exactement la même chose sous Windows (pas que ça compte vraiment ici).

Bash a un moyen simple de traiter les arguments. Utilisez "$@" (avec les guillemets) pour obtenir un tableau de tous les arguments (utile par exemple dans une boucle for..in). $@, "$*"et $*faites des choses similaires, mais vous en avez presque toujours envie "$@". Voir ici pour plus d'informations sur les détails.

De plus, vous pouvez accéder directement à des arguments spécifiques comme $Xoù X est le numéro d'argument. Par exemple:

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

Dans les grands scripts, il est préférable d'affecter ceux-ci aux variables nommées:

$ 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
la source