คลิปบอร์ดสำหรับคัดลอกและวางไฟล์ในบรรทัดคำสั่ง?


25

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

โซลูชันชั่วคราวของฉันคือใช้/tmpเป็นสถานที่ชั่วคราวเพื่อเก็บสำเนาของไฟล์ cp myfile /tmpเมื่อฉันอยู่ในไดเรกทอรีแรกและจากนั้นcp /tmp/myfile .เมื่อฉันอยู่ในไดเรกทอรีที่สอง แต่ฉันอาจตรวจสอบว่าไฟล์จะเขียนทับสิ่งใด ๆ/tmpหรือไม่

มีบางสิ่งที่คล้ายกับคลิปบอร์ดสำหรับคัดลอกและวางไฟล์หรือไม่?


1
คุณจะต้องพิมพ์cdคำสั่งเพื่อให้คุณสามารถcd -ที่จะกลับไปยังไดเรกทอรีก่อนหน้านี้ลูกศรขึ้นจะจำcdคำสั่งและแก้ไขบรรทัดที่จะแทนcp cd(ctrl-a (จุดเริ่มต้นของบรรทัด), alt-d (kill-word) cp -a,, ctrl-e (จุดสิ้นสุดของบรรทัด))
Peter Cordes

ด้วย Emacs และM-x termคุณสามารถใช้คลิปบอร์ดของ Emacs ได้
Pål GD

1
คุณสามารถใช้ Midnight Commander และลืมเกี่ยวกับการกระโดดผ่านห่วง
Deer Hunter

@ PålGDผู้คนพูดว่า Emacs 'เป็นระบบปฏิบัติการ ... ส่วนใหญ่มีคลิปบอร์ด;)
Volker Siegel

@JeffSchaller ขอบคุณ ................................
ทิม

คำตอบ:


59

ใช้ Bash ฉันจะไปที่ไดเรกทอรี:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

จากนั้นฉันจะใช้ทางลัด~-ซึ่งชี้ไปยังไดเรกทอรีก่อนหน้า:

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .

หากต้องการเยี่ยมชมไดเรกทอรีในลำดับย้อนกลับดังนั้น:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-

25
+1 ฉันใช้ Unix / Linux shells มานานกว่า 20 ปีแล้วและฉันก็ไม่รู้ทางลัดนั้น
Dubu

4
"$OLDPWD"อืมมมที่เป็นทางลัดที่มีประโยชน์สำหรับ ทำไมสามcpคำสั่งแยกกัน? cp -a ~-/file[1-3].txt .
Peter Cordes

4
ที่จริงแล้วทั้งสามcpเป็นตัวอย่าง ในโลกแห่งความเป็นจริงสามารถใช้อักขระตัวแทนเพื่อทำให้งานคัดลอกง่ายขึ้น
Anderson Medeiros Gomes

2
ฉันกำลังจะพูดถึงบางสิ่งบางอย่างเกี่ยวกับpushdและแยกdirs... แต่นี่ไกลดีกว่า ฉันขอแนะนำให้คุณเพิ่มความจริงที่"$OLDPWD"เทียบเท่า~-และพกพาสะดวกกว่า (มีประโยชน์สำหรับผู้ที่ไม่ได้ใช้bash)
Wildcard

1
~+เป็นทางลัดในทำนองเดียวกันสำหรับ"$PWD"
Paul Evans

11

หากฉันเห็นว่าสถานการณ์เป็นแบบครั้งเดียวฉันอาจจะ:

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .

หากมีไดเรกทอรีที่ฉันพบว่าตัวเองกำลังคัดลอกไฟล์แบบกึ่งประจำฉันอาจจะกำหนดตัวแปรช่วยจำบางอย่างสำหรับพวกเขาใน. profile ของฉัน

แก้ไขเพื่อเพิ่ม:

หลังจากนอนหลับบนมันฉันสงสัยว่าฉันจะได้รับพฤติกรรม GUI / OS อื่น ๆ อย่างใกล้ชิดที่คุณเลือกจำนวนไฟล์ "ตัด" หรือ "คัดลอก" พวกเขาแล้ว "วาง" พวกเขาที่อื่น กลไกการเลือกที่ดีที่สุดที่ฉันคิดได้คือสมอง / ความชอบของคุณบวกกับคุณสมบัติที่กลมกลืนของเปลือก ฉันไม่ได้มีความคิดสร้างสรรค์มากนักในการตั้งชื่อ แต่นี่เป็นแนวคิดพื้นฐาน (ในไวยากรณ์ Bash):

function copyfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=copy
}

function cutfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=cut
}

function pastefiles {
  for f in "${_copypastefiles[@]}"
  do
    cp "${_copypastesrc}/$f" .
    if [[ ${_copypastemode} = "cut" ]]
    then
      rm "${_copypastesrc}/$f"
    fi
  done
}

ที่จะใช้มันให้ใส่รหัสลงใน ~ / .bash_profile แล้วcdไปยังไดเรกทอรีแหล่งที่มาและการทำงานอย่างใดอย่างหนึ่งหรือcopyfiles glob*here cutfiles glob*hereสิ่งที่เกิดขึ้นคือเปลือกของคุณขยายความขุ่นมัวและทำให้ชื่อไฟล์เหล่านั้นอยู่ในอาร์เรย์ จากนั้นคุณcdไปยังไดเรกทอรีปลายทางและเรียกใช้pastefilesซึ่งดำเนินการcpคำสั่งสำหรับแต่ละไฟล์ต้นฉบับ หากคุณเคย "ตัด" ไฟล์ก่อนหน้านี้แล้วพาสเทลก็จะลบไฟล์ต้นฉบับ (หรือพยายาม) สิ่งนี้จะไม่ทำการตรวจสอบข้อผิดพลาดใด ๆ (ของไฟล์ที่มีอยู่ก่อนที่จะมีการอุดตันด้วยcpหรือคุณมีสิทธิ์ในการลบไฟล์ในช่วง "ตัด" หรือคุณสามารถเข้าถึงไดเรกทอรีต้นฉบับอีกครั้งหลังจากที่คุณย้ายออก ของมัน)


4
สำหรับ one-off ของคุณ$OLDPWDมีอยู่แล้วซึ่งสามารถย่อให้สั้นลง~-ใน bash และ zsh
Gilles 'หยุดความชั่วร้าย'

5

ฉันคิดว่า~-เป็นคำตอบที่ถูกต้อง แต่โปรดทราบว่า bash มีตัวแก้ไขบรรทัดในตัวที่สามารถคัดลอก / วางข้อความได้

หากคุณอยู่ในโหมด emacs คุณสามารถเรียกคืนcdคำสั่งของคุณจากประวัติและใช้Control-uในการฆ่าบรรทัดลงใน "คลิปบอร์ด" ทุบตีที่เรียกว่า kill-ring (มีวิธีอื่นด้วย) จากนั้นคุณสามารถงัดสายนี้เป็นคำสั่งใหม่ในเวลาใด ๆ Control-yกับ เห็นได้ชัดว่าในตัวอย่างของคุณขึ้นอยู่กับว่าคุณใช้ชื่อไดเรกทอรีที่แน่นอนในcdคำสั่งของคุณ

Meta-.นอกจากนี้คุณยังสามารถใช้ค่าเริ่มต้นที่น่าสนใจที่สำคัญที่มีผลผูกพันของ คำนี้คัดลอกคำสุดท้ายจากคำสั่งก่อนหน้าไปยังบรรทัดปัจจุบันของคุณ หากทำซ้ำทุกครั้งที่ย้อนกลับหนึ่งคำสั่งในประวัติ ดังนั้นถ้าคุณทำcd /xแล้วcd /yตามด้วยcdMeta-.Meta-.คุณจะมี/xในการป้อนข้อมูลของคุณ


5

การขยายคำตอบจาก Anderson M. Gomesนั้น Bash ช่วยให้คุณสามารถอ้างถึงไดเรคทอรีก่อนหน้าในไดเรกทอรีสแต็กของคุณโดยการพิมพ์~N(หรือ~+N) ซึ่งNเป็นตำแหน่งบนสแต็ก dir ตัวอย่างเช่น:

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

ตอนนี้คุณสามารถคัดลอกไฟล์ระหว่างสองไดเรกทอรีที่ผ่านมาไม่ได้เป็นไดเรกทอรีปัจจุบันด้วย:

cp -v ~3/file1.txt ~2

ในการแก้ปัญหาโปสเตอร์ต้นฉบับคุณต้องทำ:

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

ด้วยชุดไฟล์ขนาดใหญ่คุณสามารถแสดงรายการชื่อไฟล์ในไฟล์ Manifest จากนั้นทำการคัดลอกจากซอร์สต้นทาง:

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

ดูเพิ่มเติมที่: ส่วนนี้ของหน้า Bash man


ในทำนองเดียวกันใน Tcsh คุณสามารถใช้=2สัญกรณ์ (แทน~2) เพื่ออ้างถึง dir ที่สองบนสแต็ก dir ของคุณ

ดูเพิ่มเติมที่: ส่วนนี้ของหน้าคน Tcsh


4

เมื่อคุณอยู่ในไดเรกทอรีแรกให้บอกแหล่งที่มาหรือพูดให้srcดำเนิน

src=${PWD}

จากนั้นcdในไดเรกทอรีที่สองและดำเนินการ:

cp -i ${src}/filename .

-iตัวเลือกที่จะถามว่าคุณต้องการจะเขียนทับถ้ามีไฟล์ที่ซ้ำกัน


ขอบคุณ มันจะดียิ่งขึ้นโดยไม่ต้องระบุชื่อไฟล์
ทิม

4

ความแตกต่างในการตอบสนอง anderson-m-gomes ใช้ Bash ฉันจะไปที่ไดเรกทอรี:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

จากนั้นฉันจะใช้ตัวแปร $ OLDPWD ซึ่งชี้ไปยังไดเรกทอรีก่อนหน้า:

$ cp -v $OLDPWD/file1.txt .

หากต้องการเยี่ยมชมไดเรกทอรีในลำดับย้อนกลับดังนั้น:

$ cp -v fileA.txt $OLDPWD/

3
+1 แต่คุณลืม "อ้างอิง" การขยายตัวแปรของคุณ หาก$OLDPWDมีช่องว่างการแบ่งนี้ cp -aยังฉันมักจะใช้ นอกจากนี้ยังโชคไม่ดีที่การเติมแท็บเสร็จสมบูรณ์ตามการขยายของตัวแปร คุณสามารถใช้ ctrl-alt-e เพื่อเชลล์ขยายบรรทัดคำสั่งปัจจุบันแม้ว่าหลังจากพิมพ์ส่วน $ OLDPWD
Peter Cordes

1
~-เป็นทางลัดสำหรับ$OLDPWD
Gilles 'SO- หยุดความชั่วร้าย'

ฉันแค่ชี้ให้เห็นการเปลี่ยนแปลงอื่นเนื่องจาก Unix / Linux เต็มไปด้วยพวกเขา ขำ ๆ ที่ฉันใช้ Linux เป็นเวลา> 20 ปีและฉันไม่เคยเห็นมาก่อนเลย ~ - ก่อน นอกจากนี้ $ OLDPWD ยังจำได้ง่าย
Scott Carlson

3

หากในทุบตีผมจะใช้pushdและpopd คำสั่งเหล่านี้เก็บสแต็กไดเร็กทอรี FIFO ที่มีประโยชน์เพื่อใช้ในภายหลัง คุณสามารถปรึกษาสแต็คทุกเวลาโดยใช้dirs

เช่นนี้ฉันจะทำ:

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

คุณสามารถใช้xclip:

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads  from standard in, or from one or more files, and makes the data available as an X selection for pasting
       into X applications. Prints current X selection to standard out.

ตัวอย่าง:

$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2

ยังเยี่ยมชมxsel


นั่นจะเป็นการtar | gzipเข้า / ออกของคลิปบอร์ด X ค่อนข้างงอแงเมื่อเทียบกับcpและไม่ได้พูดคุยกันทั่วไปในการสร้าง symlink หรือ hardlinks ( cp -asหรือcp -al)
Peter Cordes

1

คุณสามารถตรวจสอบclipboard-filesสคริปต์ได้ที่นี่: https://github.com/larspontoppidan/clipboard-files

มันมีคำสั่งเช่นccopy, ccutและcpasteที่ใช้คลิปบอร์ดสภาพแวดล้อมเดสก์ทอปและอนุญาตให้คัดลอกที่ใช้งานง่าย / วางไฟล์:

ccopy myfile
cd <second directory>
cpaste

เนื่องจากมีการใช้คลิปบอร์ดสภาพแวดล้อมเดสก์ท็อปการคัดลอก / การวางจะโต้ตอบกับไฟล์ที่วางในคลิปบอร์ดในโปรแกรมอื่นเช่นตัวจัดการไฟล์และ IDE อย่างน้อยก็ใช้งานได้บนเดสก์ท็อป Gnome

การเปิดเผยอย่างสมบูรณ์ฉันเขียนสคริปต์หลังจากเลิกค้นหาสิ่งที่ต้องการออกไปที่นั่น ...

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