เมื่อฉันพยายามใช้ sftp เพื่อถ่ายโอนไดเรกทอรีที่มีไฟล์ฉันได้รับข้อความแสดงข้อผิดพลาด:
skipping non-regular file directory_name
ไดเรกทอรีประกอบด้วยไฟล์จำนวนหนึ่งและสองไดเรกทอรีย่อย
ผมทำอะไรผิดหรือเปล่า?
เมื่อฉันพยายามใช้ sftp เพื่อถ่ายโอนไดเรกทอรีที่มีไฟล์ฉันได้รับข้อความแสดงข้อผิดพลาด:
skipping non-regular file directory_name
ไดเรกทอรีประกอบด้วยไฟล์จำนวนหนึ่งและสองไดเรกทอรีย่อย
ผมทำอะไรผิดหรือเปล่า?
คำตอบ:
sftp
เช่นcp
และscp
ต้องการให้เมื่อคุณคัดลอกโฟลเดอร์ (และเนื้อหาในโฟลเดอร์อย่างชัดแจ้ง) คุณต้องบอกอย่างชัดเจนว่าคุณต้องการถ่ายโอนโฟลเดอร์ซ้ำด้วย-r
ตัวเลือก
ดังนั้นเพิ่ม-r
คำสั่ง
-r
ไปยังsftp
คำสั่งเมื่อคุณเชื่อมต่อ sftp -r user@host
Couldn't canonicalise: No such file or directory
เมื่อคัดลอกซ้ำไดเรกทอรีไปยังเซิร์ฟเวอร์ระยะไกลไดเรกทอรีที่ตัวเองต้องมีอยู่แล้วบนเซิร์ฟเวอร์เป้าหมายมิฉะนั้นการถ่ายโอนจะล้มเหลวด้วยข้อผิดพลาดที่ไม่ชัดเจน:
# sftp user@remote-host
#> get -r remote-folder
rsync
ฉันสามารถขอแนะนำให้คุณใช้ มันค่อนข้างมาตรฐานอุตสาหกรรมเมื่อย้ายไฟล์ผ่านการเชื่อมต่อที่ปลอดภัย
rsync -alPvz ./source_dir server.com:destination_dir
มันเป็นสิ่งที่ฉันใช้มานานหลายปีแล้วในตอนนี้
( -a
ตัวเลือกดูแลสิ่งต่าง ๆ เช่นการเรียกซ้ำไดเรกทอรี)
-a
= เรียกซ้ำ + เก็บลิงก์สัญลักษณ์สิทธิ์เวลาแก้ไขเจ้าของกลุ่มไฟล์พิเศษและไฟล์อุปกรณ์ (หลังจำเป็นต้องใช้สิทธิ์ผู้ใช้ขั้นสูง); -l
= เก็บลิงก์สัญลักษณ์ (รวมอยู่ใน-a
); -P
= แสดงความคืบหน้าในระหว่างการถ่ายโอน + เก็บไฟล์ที่ถ่ายโอนบางส่วน; -v
= โหมด verbose (แต่ดูเหมือนว่าจำเป็นเมื่อใช้-P
เพื่อหลีกเลี่ยงข้อผิดพลาดแปลก ๆprotocol version mismatch
) -z
= เปิดใช้งานการบีบอัดข้อมูลที่ถ่ายโอน
-l
จะต้องใช้สวิตช์หรือไม่ ผมจำได้ว่ารุ่นเก่าไม่ได้รวมอยู่ใน-l
-a
คุณอาจใช้งานscp
ได้ รูปแบบทั่วไปคือ
scp -rp sourceDirName username@server:destDirName
scp
หมายถึง "สำเนาที่ปลอดภัย" ธงนั้น
-r
แบ่งเป็นไดเรกทอรีย่อย-p
รักษาเวลาการแก้ไขฉันเชื่อว่ารายการที่เหลือเป็นแบบอธิบายตนเอง
สิ่งนี้ใช้ได้กับฉัน:
1) เชื่อมต่อผ่านsftp
โฮสต์ระยะไกล
2) เปลี่ยนเป็นรีโมตไดเร็กทอรีที่คุณต้องการคัดลอก (ตัวอย่าง: cd Music)
3) เปลี่ยนเป็นไดเรกทอรีท้องถิ่นที่คุณต้องการคัดลอกเนื้อหา (ตัวอย่าง: lcd Desktop)
4) ใช้คำสั่งนี้: get -r *
หากrsync
ไม่ใช่ตัวเลือกฉันขอแนะนำต่อไปlftp
:
lftp sftp://user@host.com/path/path/
จากนั้นใช้mirror
คำสั่งเพื่ออัปโหลดซ้ำดังนี้:
mirror -R
(หมายเหตุ recursion ที่เป็นค่าเริ่มต้นที่. -R
สำหรับการกลับ - เพื่อให้การอัปโหลดคำสั่งกระจกแทนการดาวน์โหลดลองเพิ่ม. --dry-run
ที่จะทำทดลองเพื่อให้แน่ใจว่าทำในสิ่งที่คุณคาดหวัง.)
หรือจะอัปโหลดโดยไม่มีการเรียกซ้ำ:
mirror --no-recursion
คุณต้องcd
เข้าไปในไดเรกทอรีที่คุณต้องการสะท้อน ใช้งานได้ดี!
หากคุณสามารถใช้sshfs มันเป็นระบบไฟล์ของFUSE ที่มีอยู่ใน unices ที่ทันสมัยที่สุดและทำงานกับเซิร์ฟเวอร์ SFTP ใด ๆ นี่คือระบบไฟล์ระยะไกล: ช่วยให้คุณสามารถจัดการไฟล์ระยะไกล (ผ่านโปรโตคอล SFTP) ด้วยยูทิลิตี้ปกติ
mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point
มันเป็นเรื่องเล็กน้อย แต่สิ่งที่ใช้ได้ผลสำหรับฉันคือ:
ssh
เพื่อเข้าสู่ระบบเครื่องระยะไกลsftp
จากเครื่องระยะไกลไปยังเครื่องท้องถิ่นของคุณget
คำสั่งพร้อม-r
ตัวเลือกเพื่อย้ายไดเรกทอรีและไฟล์ทั้งหมดsftp> get -r data /opt/bin get: Invalid flag -r
หากคำถามของคุณคือ 'ฉันจะใช้ SFTP เพื่อถ่ายโอนไดเรกทอรี' ได้อย่างไร
sftp -r user@server
แต่ถ้าคุณถ่ายโอนไดเรกทอรีฉันอาจแนะนำสองตัวเลือกที่ดีกว่าขึ้นอยู่กับความต้องการของคุณ sftp
ต้องเข้าสู่เซิร์ฟเวอร์ระยะไกลในพรอมต์คำสั่ง ssh เหมือน แต่ถ้าสิ่งที่คุณต้องการคือไฟล์มีวิธีที่ง่ายและรวดเร็วยิ่งขึ้น
Scp
สำหรับการถ่ายโอนครั้งเดียวให้ลองอัปโหลด:
# upload source directory to remote server
scp -rp source_dir user@server:dest
#download directory from remote server:
scp -rp user@server:source_dir dest
#specifying ssh key:
scp -rp -i ~/.ssh/key user@server:source_dir dest
#remote directory has spaces
scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest
rsync
หากคุณวางแผนที่จะซิงค์ไดเรกทอรีเป็นประจำการใช้ rsync จะสมเหตุสมผลมากขึ้น จะดำเนินการ deltas ระหว่างสองไดเรกทอรีประหยัดเวลาการโอนและข้อมูลผ่านสาย
rsync -r -a -v -e ssh --delete source_dir user@server:dest
นี่คือรายการของตัวเลือก rsync ที่พบบ่อยที่สุด: ( นำมาจากที่นี่ )
หวังว่าจะช่วย!
คุณสามารถได้รับจากเซิร์ฟเวอร์ไปยังเส้นทางท้องถิ่นของคุณโดย
scp -rp user@server:directoryname(full path) .