วิธีการย้ายไดเรกทอรีไฟล์โดยไฟล์? (แทน“ คัดลอกแล้วลบ”)


20

คอมพิวเตอร์ของฉันมีไดรฟ์ 500GB หนึ่งตัว

ฉันต้องการที่จะย้าย 400GB ของข้อมูลจากการ/unencrypted/encrypted

ทั้งสองไดเร็กทอรีอยู่ในพาร์ติชันเดียวกัน แต่/encryptedจัดการโดยecryptfsดังนั้นmv /uncrypted/* /encryptedจะ:

  1. คัดลอกไฟล์ทั้งหมดไปยังปลายทาง
  2. จากนั้นลบออกจากแหล่งที่มา

... ซึ่งฉันไม่สามารถจ่ายได้เพราะต้องใช้ 800GB
หากไฟล์ถูกย้ายแบบหนึ่งต่อหนึ่งจะไม่มีปัญหา (โซน ecryptfs เป็นแบบไดนามิก)

มีmvตัวเลือกหรือเครื่องมืออื่นที่ย้ายไดเรคทอรีไฟล์ต่อไฟล์หรือไม่?
มีไฟล์จำนวนมากดังนั้น ARG_MAX อาจเป็นปัญหาสำหรับโซลูชันที่ใช้สคริปต์

คำตอบ:


20

หากคุณมีrsync(ลบ--dry-runเพื่อทำจริง):

rsync --dry-run --remove-source-files -avHAX /unencrypted/ /encrypted

มิฉะนั้นให้ใช้ bash4 + และ GNU stat:

#!/bin/bash

set -e

shopt -s nullglob globstar

for from in /unencrypted/**/*; do
    to="${from/\/un//}"
    if [[ -d "$from" ]]; then
        echo mkdir -p "$to"
        echo chmod "$(stat -c %a "$from")" "$to"
        echo chown "$(stat -c %u:%g "$from")" "$to"
    else
        echo cp -a "$from" "$to" && echo rm "$from"
    fi
done

echo rm -r /unencrypted

หากต้องการเรียกใช้แบบจริงให้ลบออกechoจากแต่ละคำสั่ง


ฉันชอบความคิด rsync! เห็นได้ชัดว่าไฟล์จะถูกลบอย่างแน่นอนเมื่อมีการย้าย: superuser.com/questions/405761
Nicolas Raoul

@NicolasRaoul หากฉันจำได้ถูกต้องการลบจะถูกบัฟเฟอร์ แต่ก็ใกล้กับการคัดลอก / ลบแบบหนึ่งต่อหนึ่ง
Chris Down

ชิ้นส่วนฉันดีสำหรับฉันตราบใดที่แต่ละชิ้นน้ำหนักน้อยกว่า 50GB
Nicolas Raoul

คุณไม่จำเป็นต้องลบออก--dry-runจากบรรทัดคำสั่ง rsync ด้วยใช่ไหม
CVn

1
@meduz vเป็นทางเลือกและเพียงพิมพ์ชื่อไฟล์เมื่อถ่ายโอน aHAXต้องใช้เพื่อเก็บแอตทริบิวต์ไฟล์ที่เป็นไปได้ทั้งหมด - aเป็นไฟล์เก็บถาวรHAXคือ "เก็บฮาร์ดลิงก์, ACLs และแอตทริบิวต์เพิ่มเติม"
Chris Down
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.