ย้ายไฟล์และปล่อยให้ลิงค์อ่อนทิ้ง


10

ฉันกำลังมองหาคำสั่ง linux เดียวที่ให้ฉันทำสิ่งนี้ได้:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

หากไม่มีอยู่วิธีที่ดีที่สุดในการทำเช่นนี้คือการรวมกลุ่มของไฟล์


ฉันไม่รู้จัก Bash scripting ดีพอที่จะเขียน แต่วิธีแก้ปัญหาของฉันคือการเขียนสคริปต์และเรียกมันว่าสิ่งที่จับใจเหมือน cpln
Unkwntech

1
ไม่ควร cp เป็น mv?
Bart van Heukelom

ไม่ได้ตัวเลือก -f เพื่อ ln ดูแลสิ่งนั้น
innaM

1
ลองบน 10GB ไฟล์
hayalci

2
@HelloGoodbye คุณกำลังสับสนกับ&& &ตามที่เขียนไว้บรรทัดจะตรวจสอบค่าส่งคืนของ cp และรันเฉพาะส่วนที่สองหากทำได้สำเร็จ
itsadok

คำตอบ:


7

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

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

แต่ฉันคิดว่าคุณต้องการย้ายเนื้อหาของ / some / path / ไปยังดิสก์อื่นแล้วสร้างลิงก์ไปยังไฟล์ใหม่เพื่อแจ้งให้ทราบว่า "ไม่มีใคร"

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

ห่อในฟังก์ชั่นทุบตี:

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

มีวิธีที่จะทำให้งานนี้ถ้าสิ่งที่ฉันย้ายเกิดขึ้นเป็นไดเรกทอรีหรือไม่?
tladuke

วิธีนี้จะย้ายไฟล์จริงบนดิสก์ได้อย่างไร
อิบราฮิม

อิบราฮิม: ข้อมูลไม่เคลื่อนไหวมันเป็นเพียงการอัปเดตพอยน์เตอร์ในไดเรกทอรี
Mr Shark

tladuke: ใช่และไม่ใช่ ตั้งแต่ไดเรกทอรี smaler มากบนดิสก์ไม่มีความจำเป็นสำหรับเคล็ดลับการ ln (ซึ่งจะไม่ได้ทำงานสำหรับ directorys) เพียงทำ mv :-)
นายฉลาม

2

มีสคริปต์ของฉันที่คุณสามารถใช้ (ใช้สองพารามิเตอร์ / บาง / เส้นทาง / ไฟล์และ / อื่น / เส้นทาง /):

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

เคล็ดลับเด็ด ๆ ที่มีการจัดการสตริงไม่เคยเห็นมาก่อน ขอบคุณ!
itsadok

1

อย่างจริงจังฉันคิดว่านี่เป็นคำถามที่ง่ายมาก

นี่คือสิ่งที่ฉันสามารถทำได้ใน perl:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

ฉันหวังว่าจะได้สิ่งที่สวยงามกว่านี้ แต่ฉันคิดว่าฉันจะใช้มัน


1
ในการทำ "ใน Perl" คุณควรใช้ File :: Copy (หรือคล้ายกัน) และ symlink () Perl ไม่ได้เปลือก; หลีกเลี่ยงระบบ () และโดยเฉพาะอย่างยิ่งหลีกเลี่ยงการส่งผ่านบรรทัดคำสั่งทั้งหมดไปยังระบบ () (เช่นจะเกิดอะไรขึ้นถ้าอาร์กิวเมนต์มีช่องว่าง?) ไม่ว่าจะด้วยวิธีใดเสมอตลอดเวลาเสมอตรวจสอบค่าที่ส่งคืน
John Siracusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.