Bash Script para arrastrar y soltar un archivo a una nueva ubicación

8

Estoy seguro de que me entregarán mi trasero por esta pregunta, pero parece que no puedo entenderlo. Soy nuevo en bash scripting, así que ve con calma ...

Quiero poder arrastrar y soltar un archivo en una aplicación de escritorio, que luego llama a un script bash que moverá ese archivo a una ubicación designada dentro del script bash. Aquí está lo que tengo hasta ahora.

Guión Bash

#! /bin/bash

mv $file /path/to/new/directory

Sin embargo, no puedo entender cómo ingresar el $filecomo una variable cuando lo arrastro y lo dejo caer en una aplicación de escritorio. ¿Cómo puedo hacer esto?

Motivo: Tengo documentos que necesito leer en una carpeta, y una vez que los he leído, los pongo en otra carpeta. Básicamente solo quiero que sea más fácil hacer esto.

Gracias paul

PaulFrater
fuente
2
No entiendo, ¿por qué no los arrastras y sueltas si eso es lo que quieres? Parece que se pregunta cómo arrastrar a la carpeta1, lo que hará que el elemento arrastrado se mueva a la carpeta 2. ¿Por qué no lo arrastra directamente a la carpeta2 en primer lugar?
terdon
2
No conozco ningún administrador de archivos que le permita arrastrar y soltar un archivo en una aplicación, y luego pasar ese archivo a la aplicación para hacer algo. Todos los administradores de archivos que he usado solo admiten arrastrar archivos a carpetas. ¿Tienes alguna razón para pensar que esto podría ser posible? ¿Has visto una aplicación que funciona de esta manera? Por supuesto, puede hacer esto con una aplicación web (que luego proporciona la API de arrastrar y soltar del navegador) u otro tipo de aplicación más compleja, pero eso puede ser demasiado complejo para explicarlo en una respuesta de AskUbuntu.
Robin Winslow el
1
¿No hacen esto la mayoría de las terminales y los administradores de archivos? En XFCE, arrastrando un archivo desde Thunar a un terminal pega el nombre de archivo completo. Y arrastrar un archivo a algo como LibreOffice o Gedit lo abrirá (al menos, intenta hacerlo). Esto parece que depende completamente de la aplicación hacer lo que quiera con el nombre del archivo.
Xen2050
@terdon. Sí, solo quiero arrastrar y soltar en otra carpeta, pero quería una forma rápida de hacerlo sin tener que retroceder del directorio en el que estaba y moverme completamente a un nuevo directorio y luego volcar el archivo allí. Eso me parece ineficiente. Para todos los demás, vea la respuesta proporcionada por Slug45 a continuación.
PaulFrater

Respuestas:

24
  1. Cree un archivo de script bash con los siguientes contenidos:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. Cree un archivo .desktop con el siguiente contenido:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. Cambie PATH_TO_NEW_DIRECTORY y PATH_TO_SCRIPT_FILE a su gusto.

  4. Hacer chmod +x script_name

  5. Arrastre los archivos al archivo .desktop.

  6. ¡Hecho!.

Babosa45
fuente
1
Debe enfatizarse que siempre necesita citar las variables, como se muestra. Usar en $filelugar de "$file"(o "${file}") puede meterte en un montón de problemas.
Paddy Landau
Además, no es necesario usar bashaquí; #!/bin/shes suficiente para hacer lo mismo (aunque puede estar vinculado de bashtodos modos en muchos sistemas).
ckujau
14

No hay necesidad de un guión. Cree un enlace a PATH_TO_NEW_DIRECTORY donde lo necesite. Luego arrastre el archivo al enlace

Jean-Marie
fuente
2
Esta habría sido una solución más fácil (pero entonces no habría aprendido algo sobre las secuencias de comandos bash :)
PaulFrater 05 de
Esta es la forma "obvia" de hacerlo y responde la pregunta. Pero, si usa una secuencia de comandos, esa secuencia de comandos puede ser arbitrariamente compleja y hacer diferentes cosas dependiendo de qué archivo se pasa, como colocar archivos de música en un lugar y documentos en otro lugar, o simplemente cambiar el destino sin tener que reemplazar el enlace simbólico.
Joe
3

Lo que dijo @ Slug45 es completamente correcto. Sin embargo, carece de una explicación.

Cuando arrastra y suelta un archivo en un archivo ejecutable (o un enlace a uno), ese ejecutable se ejecuta con la ruta al archivo arrastrado como argumento. Esto es exactamente lo mismo en Windows (no es que realmente importe aquí).

Bash tiene una forma simple de tratar con argumentos. Use "$@" (con las comillas) para obtener una matriz de todos los argumentos (útil, por ejemplo, en un bucle for..in). $@, "$*"y $*hacer cosas similares, pero casi siempre quieres "$@". Consulte aquí para obtener más información sobre los detalles.

Además, puede acceder directamente a argumentos específicos como $Xdonde X es el número arg. Por ejemplo:

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

En scripts grandes, es mejor asignarlos a variables con nombre:

$ 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
fuente