ฉันจะคัดลอกไดเรกทอรีทั้งหมดไปยังไดเรกทอรีที่มีชื่อเดียวกันโดยไม่ต้องแทนที่เนื้อหาในไดเรกทอรีปลายทางได้อย่างไร (ฉันต้องการเพิ่มเนื้อหาของโฟลเดอร์ปลายทางแทน)
ฉันจะคัดลอกไดเรกทอรีทั้งหมดไปยังไดเรกทอรีที่มีชื่อเดียวกันโดยไม่ต้องแทนที่เนื้อหาในไดเรกทอรีปลายทางได้อย่างไร (ฉันต้องการเพิ่มเนื้อหาของโฟลเดอร์ปลายทางแทน)
คำตอบ:
ใช้rsync
และผ่าน-u
หากคุณต้องการอัปเดตเฉพาะไฟล์ที่ใหม่กว่าในไดเรกทอรีดั้งเดิมหรือ--ignore-existing
ข้ามไฟล์ทั้งหมดที่มีอยู่แล้วในปลายทาง
rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/
(สังเกต/
ด้านที่มา: โดยไม่rsync
สร้าง/remote/directory/directory
ขึ้น)
--ignore-existing
เพิ่มโดยไม่มีการแทนที่คุณเห็นข้อมูลสูญหายอะไร
rsync
สามารถใช้งานได้อย่างง่ายดาย .... (เช่น Win32-OpenSSH)
--rsync-path
จำเป็นต้องใช้)
scpจะเขียนทับไฟล์หากคุณมีสิทธิ์ในการเขียนลงไป
กล่าวอีกนัยหนึ่ง: คุณสามารถscp
ข้ามไฟล์ดังกล่าวได้อย่างมีประสิทธิภาพโดยลบสิทธิ์การเขียนไว้ชั่วคราว (ถ้าคุณเป็นเจ้าของไฟล์นั่นคือ)
scp -r user@server.com:/location/of/files/* /local/location/
คุณสามารถคัดลอกเฉพาะไฟล์ใหม่ตามวันที่ ใช้find
scp `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
หากคุณสามารถทำให้เนื้อหาไฟล์ปลายทางเป็นแบบอ่านอย่างเดียว:
find . -type f -exec chmod a-w '{}' \;
ก่อนที่จะทำงานscp
(มันจะบ่นและข้ามไฟล์ที่มีอยู่)
และเปลี่ยนพวกเขากลับมาหลังจากนั้น ( chmod +w
เพื่อรับค่า umask ตาม) หากไฟล์ไม่ได้มีสิทธิ์เขียนตาม umask ของคุณคุณจะต้องจัดเก็บสิทธิ์เพื่อให้คุณสามารถเรียกคืนได้
(คำตอบของ Gilles จะเขียนทับไฟล์ที่มีอยู่หากไฟล์ในเครื่องเป็นไฟล์ใหม่ฉันจะสูญเสียข้อมูลที่มีค่าในแบบนั้นอย่าเข้าใจว่าทำไมคำตอบที่ไม่ถูกต้องและเป็นอันตรายมีคะแนนมากกว่านี้)
rsync --ignore-existing
คุณทำให้ข้อมูลสูญหายได้อย่างไร
find: missing argument to '-exec'
find . -type f -exec chmod a-w {} \;
linux ของฉันไม่ดี ymmv
find . -type f -exec chmod a-w {} \;
ผมมีงานที่คล้ายกันในกรณีของฉันฉันไม่สามารถใช้rsync
, csync
หรือ FUSE เพราะการจัดเก็บข้อมูลของฉันมีเพียง SFTP rsync
ไม่สามารถเปลี่ยนวันที่และเวลาสำหรับไฟล์ได้ยูทิลิตี้อื่น ๆ (เช่นcsync
) แสดงข้อผิดพลาดอื่น ๆ ให้ฉัน: " ไม่สามารถสร้างไฟล์ชั่วคราวตรวจพบการเอียงของนาฬิกา "
หากคุณสามารถเข้าถึงเซิร์ฟเวอร์จัดเก็บข้อมูล - เพียงแค่ติดตั้งopenssh-server
หรือเปิดใช้งานrsync
เป็น daemon ที่นี่
ในกรณีของฉัน - ฉันไม่สามารถทำเช่นนี้และการแก้ปัญหาคือ: lftp lftp
การใช้งานสำหรับการทำข้อมูลให้ตรงกันด้านล่าง:
lftp -c "open -u login,password sftp://sft.domain.tld/; \
mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"
/src/folder
- เป็นโฟลเดอร์บนคอมพิวเตอร์ของฉัน/rem/folder
- sftp://sft.domain.tld/rem/folder
ถูก
คุณสามารถค้นหา man pages ได้ตามลิงค์: http://lftp.yar.ru/lftp-man.html
หากต้องการคัดลอกทั้งกลุ่มไฟล์มันจะเร็วกว่าที่จะทิ้งไว้ โดยการใช้ -k คุณยังป้องกัน tar จากการเขียนทับไฟล์เมื่อแกะมันออกจากระบบเป้าหมาย
tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>'
scp
เขียนทับไฟล์และไม่มีสวิตช์หยุดการทำเช่นนั้น แต่คุณสามารถคัดลอกสิ่งต่าง ๆ ออกไปทำ scp แล้วคัดลอกไฟล์ที่มีอยู่กลับมา ตัวอย่าง:
คัดลอกไฟล์ที่มีอยู่ทั้งหมดออกไป
mkdir original_files ; cp -r * original_files/
คัดลอกทุกอย่างโดยใช้ scp
scp -r user@server:dir/* ./
คัดลอกไฟล์ต้นฉบับไปยังสิ่งที่ scp เขียนทับ:
cp -r original_files/* ./
อีกวิธีหนึ่งในการบรรลุเป้าหมายนี้คือการทำls
ในโฟลเดอร์ปลายทาง:
ในโฟลเดอร์ปลายทางระยะไกล:
ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder
บนแหล่งที่มา:
cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data
บนปลายทาง:
scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer
-
>
ช่องว่างขึ้นบรรทัดใหม่หรืออักขระพิเศษอื่น ๆ 3. รหัสยากสำหรับห่วงในสคริปต์หลาม การสร้างโปรแกรมที่รันไทม์นั้นยากและยุ่งยาก (แม้ว่าจะทำโดยโปรแกรมเมอร์มืออาชีพ) ด้วยเหตุผลหลายประการ การสร้างเชลล์สคริปต์นั้นยิ่งเลวร้ายไปกว่านั้นคือความคิดอันยิ่งใหญ่