Bash Script เพื่อลากและวางไฟล์ไปยังตำแหน่งใหม่


8

ฉันแน่ใจว่าฉันจะส่งตูดของฉันมาให้ฉันสำหรับคำถามนี้ แต่ฉันก็ดูเหมือนจะไม่สามารถคิดออก ฉันใหม่ในการเขียนสคริปต์ทุบตีดังนั้นไปง่าย ๆ กับฉัน ...

ฉันต้องการลากและวางไฟล์ลงในแอปพลิเคชันบนเดสก์ท็อปซึ่งเรียกสคริปต์ทุบตีที่จะย้ายไฟล์นั้นไปยังตำแหน่งที่กำหนดไว้ในสคริปต์ทุบตี นี่คือสิ่งที่มีเพื่อให้ห่างไกล

Bash script

#! /bin/bash

mv $file /path/to/new/directory

อย่างไรก็ตามฉันไม่สามารถหาวิธีป้อน$fileตัวแปรเป็นเมื่อฉันลากและวางลงบนแอปพลิเคชันเดสก์ท็อป ฉันจะทำสิ่งนี้ได้อย่างไร

เหตุผล: ฉันมีเอกสารที่ฉันต้องอ่านในโฟลเดอร์เดียวและเมื่อฉันอ่านแล้วฉันใส่มันลงในโฟลเดอร์อื่น โดยทั่วไปฉันแค่ต้องการทำให้ง่ายต่อการทำเช่นนี้

ขอบคุณพอล


2
ฉันไม่เข้าใจทำไมคุณไม่ลองลากแล้วปล่อยถ้านั่นคือสิ่งที่คุณต้องการ คุณดูเหมือนจะถามว่าจะลากเข้าสู่ folder1 ซึ่งจะทำให้รายการที่ลากถูกย้ายไปยังโฟลเดอร์ 2 ทำไมคุณไม่ลากมันไปที่ folder2 โดยตรงตั้งแต่แรก?
terdon

2
ฉันไม่รู้จักตัวจัดการไฟล์ใด ๆ ที่อนุญาตให้คุณลากและวางไฟล์ลงบนแอพพลิเคชั่นแล้วส่งไฟล์นั้นไปยังแอปพลิเคชันเพื่อทำบางสิ่งด้วย ตัวจัดการไฟล์ทุกตัวที่ฉันใช้รองรับเฉพาะการลากไฟล์ไปยังโฟลเดอร์ คุณมีเหตุผลที่คิดว่าสิ่งนี้อาจเป็นไปได้หรือไม่ คุณเคยเห็นแอปพลิเคชั่นที่ทำงานด้วยวิธีนี้หรือไม่? แน่นอนว่าคุณสามารถทำสิ่งนี้กับเว็บแอปพลิเคชัน (ซึ่งให้ API การลาก & วาง API ของเบราว์เซอร์) หรือแอปพลิเคชันประเภทอื่นที่ซับซ้อนกว่า แต่อาจซับซ้อนเกินไปที่จะอธิบายในคำตอบ AskUbuntu
Robin Winslow

1
ไม่ใช่เทอร์มินัลและตัวจัดการไฟล์ส่วนใหญ่ใช่ไหม ใน XFCE ให้ลากไฟล์จาก Thunar ไปยังเทอร์มินัลวางชื่อไฟล์แบบเต็ม และการลากไฟล์ไปยังบางสิ่งเช่น LibreOffice หรือ Gedit จะเปิดขึ้นมา (อย่างน้อยก็ลอง ) ดูเหมือนว่ามันจะขึ้นอยู่กับแอพพลิเคชั่นอย่างสมบูรณ์เพื่อทำสิ่งที่ต้องการด้วยชื่อไฟล์
Xen2050

@terdon ใช่ฉันต้องการลากและวางลงในโฟลเดอร์อื่น แต่ฉันต้องการวิธีที่รวดเร็วในการทำเช่นนี้โดยไม่ต้องถอยออกจากไดเรกทอรีที่ฉันเข้ามาและย้ายไปยังไดเรกทอรีใหม่แล้วทิ้งไฟล์ไว้ที่นั่น ดูเหมือนว่าจะไม่มีประสิทธิภาพสำหรับฉัน สำหรับคนอื่น ๆ ดูคำตอบที่ได้จาก Slug45 ด้านล่าง
PaulFrater

คำตอบ:


24
  1. สร้าง bash scriptfile ด้วยเนื้อหาต่อไปนี้:

    #!/bin/bash
    mv "$1" "PATH_TO_NEW_DIRECTORY"
    
  2. สร้างไฟล์ .desktop โดยมีเนื้อหาดังต่อไปนี้:

    [Desktop Entry]
    Name=Document Mover
    Exec=PATH_TO_SCRIPT_FILE %U
    Type=Application
    
  3. เปลี่ยน PATH_TO_NEW_DIRECTORY และ PATH_TO_SCRIPT_FILE ตามที่คุณต้องการ

  4. ทำ chmod +x script_name

  5. ลากไฟล์ไปยังไฟล์ .desktop

  6. !. เสร็จสิ้น


1
มันควรจะเน้นที่คุณมักจะต้องพูดตัวแปรที่แสดง การใช้$fileแทน"$file"(หรือ"${file}") สามารถทำให้คุณมีปัญหา
Paddy Landau

นอกจากนี้ไม่จำเป็นต้องใช้bashที่นี่ #!/bin/shเพียงพอในการทำเช่นเดียวกัน (แม้ว่ามันอาจจะเชื่อมโยงกับbashอย่างไรก็ตามในระบบจำนวนมาก)
ckujau

14

ไม่จำเป็นต้องใช้สคริปต์ สร้างลิงก์ไปยัง PATH_TO_NEW_DIRECTORY ที่คุณต้องการ จากนั้นลากไฟล์ไปที่ลิงก์


2
นี้จะได้รับการแก้ปัญหาได้ง่ายขึ้น ( แต่แล้วฉันจะไม่ได้เรียนรู้อะไรเกี่ยวกับทุบตีสคริปต์ :)
PaulFrater

นี่เป็นวิธี "ชัดเจน" ในการทำและตอบคำถาม แต่ถ้าคุณใช้สคริปต์สคริปต์นั้นอาจซับซ้อนและทำสิ่งต่าง ๆ โดยขึ้นอยู่กับไฟล์ที่ส่งผ่าน - เช่นการวางไฟล์เพลงที่เดียวและเอกสารในที่อื่น - หรือเพียงแค่เปลี่ยนปลายทางโดยไม่ต้องเปลี่ยน symlink
โจ

3

สิ่งที่ @ Slug45 พูดถูกต้องสมบูรณ์ อย่างไรก็ตามมันไม่มีคำอธิบาย

เมื่อคุณลากและวางไฟล์ไปยังไฟล์ที่เรียกใช้งานได้ (หรือลิงก์ไปยังไฟล์หนึ่ง) ไฟล์ที่เรียกใช้นั้นจะถูกรันด้วยพา ธ ไปยังไฟล์ที่ลากเป็นอาร์กิวเมนต์ นี่คือสิ่งเดียวกันบน Windows (ไม่ใช่ว่ามันสำคัญจริงๆที่นี่)

Bash มีวิธีจัดการกับข้อโต้แย้งอย่างง่าย ใช้"$@" (พร้อมเครื่องหมายคำพูด)เพื่อรับอาเรย์ของอาร์กิวเมนต์ทั้งหมด (มีประโยชน์เช่นใน for..in loop) $@, "$*"และ$*ทำสิ่งที่คล้ายกัน "$@"แต่คุณมักจะต้องการ ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลเฉพาะ

นอกจากนี้คุณสามารถเข้าถึง args ที่ระบุได้โดยตรงโดย$Xที่ X คือหมายเลข arg ตัวอย่างเช่น:

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

ในสคริปต์ขนาดใหญ่จะเป็นการดีกว่าที่จะกำหนดให้ตัวแปรที่มีชื่อ:

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.