Bash Script để kéo và thả tệp vào vị trí mới


8

Tôi chắc chắn rằng tôi sẽ trao mông cho tôi cho câu hỏi này, nhưng tôi dường như không thể tìm ra nó. Tôi chưa quen với kịch bản bash, vì vậy hãy dễ dàng với tôi ...

Tôi muốn có thể kéo và thả tệp vào ứng dụng máy tính để bàn, sau đó gọi tập lệnh bash sẽ di chuyển tệp đó đến vị trí được chỉ định trong tập lệnh bash. Đây là những gì đã có cho đến nay.

Kịch bản Bash

#! /bin/bash

mv $file /path/to/new/directory

Tuy nhiên, tôi không thể tìm ra cách nhập biến $filenhư một biến khi tôi kéo và thả nó vào một ứng dụng máy tính để bàn. Tôi có thể làm cái này như thế nào?

Lý do: Tôi có những giấy tờ cần đọc trong một thư mục và một khi tôi đã đọc chúng, tôi đặt chúng vào một thư mục khác. Tôi về cơ bản chỉ muốn làm cho nó dễ dàng để làm điều này.

Cảm ơn, Paul


2
Tôi không hiểu, tại sao bạn không kéo và thả chúng nếu đó là những gì bạn muốn? Có vẻ như bạn đang hỏi làm thế nào để kéo vào thư mục1, điều này sẽ khiến mục được kéo được chuyển vào thư mục 2. Tại sao bạn không chỉ cần kéo trực tiếp vào thư mục 2 ở vị trí đầu tiên?
terdon

2
Tôi không biết bất kỳ trình quản lý tệp nào cho phép bạn kéo và thả tệp vào một ứng dụng, sau đó chuyển tệp đó đến ứng dụng để thực hiện điều gì đó. Mọi trình quản lý tệp tôi đã sử dụng chỉ hỗ trợ kéo tệp vào các thư mục. Bạn có bất kỳ lý do để nghĩ rằng điều này có thể có thể? Bạn đã thấy một ứng dụng hoạt động theo cách này? Tất nhiên bạn có thể làm điều này với một ứng dụng web (sau đó cung cấp API kéo và thả của trình duyệt) hoặc một loại ứng dụng phức tạp hơn khác, nhưng điều đó có thể quá phức tạp để giải thích trong câu trả lời của AskUbfox.
Robin Winslow

1
Đừng hầu hết các thiết bị đầu cuối và quản lý tập tin làm điều này? Trong XFCE, kéo tệp từ Thunar vào thiết bị đầu cuối sẽ dán tên tệp đầy đủ. Và kéo một tệp vào một cái gì đó như LibreOffice hoặc Gedit sẽ mở nó (ít nhất là cố gắng ). Điều này có vẻ như hoàn toàn tùy thuộc vào ứng dụng để làm bất cứ điều gì nó muốn với tên tệp.
Xen2050

@terdon. Có, tôi chỉ muốn kéo và thả vào một thư mục khác, nhưng tôi muốn một cách nhanh chóng để làm điều này mà không cần phải thoát ra khỏi thư mục mà tôi đang ở và chuyển tất cả vào một thư mục mới và sau đó đổ tập tin vào đó. Điều đó dường như không hiệu quả đối với tôi. Đối với tất cả những người khác, xem câu trả lời được cung cấp bởi Slug45 dưới đây.
PaulFrater

Câu trả lời:


24
  1. Tạo một tập lệnh bash với các nội dung sau:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
  2. Tạo tệp .desktop với nội dung sau:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
  3. Thay đổi PATH_TO_NEW_DIRECTORY và PATH_TO_SCRIPT_FILE theo ý thích của bạn.

  4. Làm chmod +x script_name

  5. Kéo tập tin vào tập tin .desktop.

  6. Làm xong!.


1
Cần nhấn mạnh rằng bạn luôn cần trích dẫn các biến, như được hiển thị. Sử dụng $filethay vì "$file"(hoặc "${file}") có thể khiến bạn gặp nhiều rắc rối.
Paddy Landau

Ngoài ra, không cần sử dụng bashở đây; #!/bin/shlà đủ để làm như vậy (mặc dù nó có thể được liên kết với bashdù sao trên nhiều hệ thống).
ckujau

14

Không cần một kịch bản. Tạo một liên kết đến PATH_TO_NEW_DIRECTORY nơi bạn cần nó. Sau đó kéo tập tin vào liên kết


2
Đây sẽ là một giải pháp dễ dàng hơn (nhưng sau đó tôi sẽ không học được gì về kịch bản bash :)
PaulFrater

Đây là cách "rõ ràng" để làm điều đó và trả lời câu hỏi. Nhưng, nếu bạn sử dụng tập lệnh, tập lệnh đó có thể phức tạp tùy ý và thực hiện các thao tác khác nhau tùy thuộc vào tập tin được truyền - như đặt tập tin nhạc ở một nơi và tài liệu ở nơi khác - hoặc chỉ cần thay đổi đích mà không phải thay thế liên kết tượng trưng.
Joe

3

Những gì @ Slug45 nói là hoàn toàn chính xác. Tuy nhiên, nó thiếu một lời giải thích.

Khi bạn kéo và thả tệp vào tệp thực thi (hoặc liên kết đến một tệp), tệp thực thi đó được chạy với đường dẫn đến tệp được kéo dưới dạng đối số. Điều này hoàn toàn giống nhau trên Windows (không phải là nó thực sự quan trọng ở đây).

Bash có một cách đơn giản để đối phó với các đối số. Sử dụng "$@" (với dấu ngoặc kép) để lấy một mảng của tất cả các đối số (ví dụ hữu ích trong vòng lặp for..in). $@, "$*"$*làm những điều tương tự, nhưng bạn hầu như luôn muốn "$@". Xem ở đây để biết thêm thông tin về các chi tiết cụ thể.

Ngoài ra, bạn có thể truy cập trực tiếp các đối số cụ thể vì $Xtrong đó X là số arg. Ví dụ:

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

Trong các tập lệnh lớn, tốt hơn là gán chúng cho các biến được đặt tên:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.