Skrypt Bash, aby przeciągnąć i upuścić plik w nowej lokalizacji

8

Jestem pewien, że dostanę dupę za to pytanie, ale wydaje mi się, że nie potrafię tego rozgryźć. Jestem nowy w skryptowaniu bashów, więc nie przejmuj się ...

Chcę mieć możliwość przeciągania i upuszczania pliku na aplikację komputerową, która następnie wywołuje skrypt bash, który przeniesie ten plik do lokalizacji wskazanej w skrypcie bash. Oto co do tej pory.

Skrypt Bash

#! /bin/bash

mv $file /path/to/new/directory

Jednak nie mogę wymyślić, jak wprowadzić $filezmienną, gdy przeciągam ją i upuszczam na aplikację komputerową. W jaki sposób mogę to zrobić?

Powód: Mam dokumenty, które muszę przeczytać w jednym folderze, a gdy je przeczytam, umieszczam je w innym folderze. Zasadniczo chcę to po prostu ułatwić.

Dzięki, Paul

PaulFrater
źródło
2
Nie rozumiem, dlaczego nie po prostu przeciągniesz i upuścisz je, jeśli tego właśnie chcesz? Wygląda na to, że pytasz, jak przeciągnąć do folderu 1, co spowoduje, że przeciągnięty element zostanie przeniesiony do folderu 2. Dlaczego po prostu nie przeciągniesz go bezpośrednio do folderu 2?
terdon
2
Nie znam żadnego menedżera plików, który pozwala przeciągać i upuszczać plik do aplikacji, a następnie przekazać go do aplikacji, aby coś zrobić. Każdy używany przeze mnie menedżer plików obsługuje tylko przeciąganie plików do folderów. Czy masz powód, by sądzić, że to możliwe? Czy widziałeś aplikację, która działa w ten sposób? Można to oczywiście zrobić za pomocą aplikacji internetowej (która następnie udostępnia interfejs API przeciągania i upuszczania przeglądarki) lub innego bardziej złożonego typu aplikacji, ale może to być zbyt skomplikowane, aby wyjaśnić w odpowiedzi AskUbuntu.
Robin Winslow
1
Czy większość terminali i menedżerów plików tego nie robi? W XFCE przeciągnięcie pliku z Thunar na terminal wkleja pełną nazwę pliku. Przeciągnięcie pliku do czegoś takiego jak LibreOffice lub Gedit otworzy go (przynajmniej spróbuje ). Wygląda na to, że aplikacja musi wykonywać dowolne czynności z nazwą pliku.
Xen2050
@terdon. Tak, chcę po prostu przeciągnąć i upuścić w innym folderze, ale chciałem to zrobić szybko, bez konieczności cofania się z katalogu, w którym byłem, i przejścia do nowego katalogu, a następnie zrzucenia tam pliku. To po prostu wydaje mi się nieefektywne. Wszystkim pozostałym zapoznaj się z odpowiedzią udzieloną przez Slug45 poniżej.
PaulFrater,

Odpowiedzi:

24
  1. Utwórz plik skryptu bash z następującą zawartością:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
    
  2. Utwórz plik .desktop z następującą zawartością:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
    
  3. Zmień PATH_TO_NEW_DIRECTORY i PATH_TO_SCRIPT_FILE według własnych upodobań.

  4. Zrobić chmod +x script_name

  5. Przeciągnij pliki do pliku .desktop.

  6. Gotowy!.

Slug45
źródło
1
Należy podkreślić, że zawsze trzeba cytować zmienne, jak pokazano. Używanie $filezamiast "$file"(lub "${file}") może sprawić kłopoty.
Paddy Landau,
Również nie trzeba bashtutaj używać ; #!/bin/shwystarczy zrobić to samo (chociaż i tak może to być powiązane z bashwieloma systemami).
ckujau,
14

Nie potrzebujesz skryptu. Utwórz link do PATH_TO_NEW_DIRECTORY tam, gdzie jest potrzebny. Następnie przeciągnij plik do łącza

Jean-Marie
źródło
2
Byłoby to łatwiejsze rozwiązanie (ale wtedy nie dowiedziałbym się czegoś o skryptach bash :)
PaulFrater
Jest to „oczywisty” sposób na zrobienie tego i odpowiedź na pytanie. Ale jeśli używasz skryptu, skrypt ten może być dowolnie złożony i wykonywać różne czynności w zależności od przekazywanego pliku - na przykład umieszczać pliki muzyczne w jednym miejscu i dokumenty w innym miejscu - lub po prostu zmieniać miejsce docelowe bez konieczności zastępowania dowiązania symbolicznego.
Joe,
3

To, co powiedział @ Slug45, jest całkowicie poprawne. Brakuje jednak wyjaśnienia.

Podczas przeciągania i upuszczania pliku na plik wykonywalny (lub łącze do jednego), plik wykonywalny jest uruchamiany ze ścieżką do przeciąganego pliku jako argumentem. To jest dokładnie to samo w systemie Windows (nie to, że naprawdę ma to znaczenie tutaj).

Bash ma prosty sposób radzenia sobie z argumentami. Użyj "$@" (z cudzysłowami), aby uzyskać tablicę wszystkich argumentów (przydatne na przykład w pętli for..in). $@, "$*"I $*robić podobne rzeczy, ale prawie zawsze chcą "$@". Zobacz tutaj, aby uzyskać więcej informacji na temat szczegółów.

Ponadto można bezpośrednio uzyskać dostęp do określonych argumentów, ponieważ $Xgdzie X jest liczbą argumentów. Na przykład:

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

W dużych skryptach lepiej przypisać je do nazwanych zmiennych:

$ 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
źródło