Jak przenieść katalog, plik po pliku? (zamiast „skopiuj, a następnie usuń”)

20

Mój komputer ma jeden dysk 500 GB.

Chcę przenieść 400 GB danych z /unencrypteddo /encrypted.

Oba katalogi znajdują się na tej samej partycji, ale /encryptedsą obsługiwane przez ecryptfs , więc mv /uncrypted/* /encrypted:

  1. Skopiuj wszystkie pliki do miejsca docelowego
  2. Następnie usuń je ze źródła

... na co mnie nie stać, ponieważ wymaga 800 GB.
Gdyby pliki były przenoszone jeden po drugim, nie byłoby problemu (strefa ecryptfs jest dynamiczna).

Czy istnieje mvopcja lub inne narzędzie, które przenosi katalog plik po pliku?
Istnieje ogromna liczba plików, więc ARG_MAX może stanowić problem dla rozwiązań opartych na skryptach.

Nicolas Raoul
źródło

Odpowiedzi:

20

Jeśli masz rsync(usuń, --dry-runaby to zrobić naprawdę):

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

W przeciwnym razie, używając bash4 + i 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

Aby uruchomić go naprawdę, usuń echoz każdego polecenia.

Chris Down
źródło
Uwielbiam pomysł rsync! Najwyraźniej pliki są rzeczywiście usuwane podczas ich przenoszenia: superuser.com/questions/405761
Nicolas Raoul
@NicolasRaoul Jeśli dobrze pamiętam, usuwanie jest buforowane, ale jest zbliżone do kopiowania / usuwania jeden do jednego.
Chris Down,
Kawałki są dla mnie w porządku, o ile każda z nich waży mniej niż 50 GB.
Nicolas Raoul
Czy nie musisz też usuwać --dry-runz wiersza polecenia rsync?
CVn
1
@meduz vjest opcjonalny i po prostu drukuje nazwy plików podczas ich przesyłania. aHAXjest wymagany do zachowania wszystkich możliwych atrybutów pliku - ajest archiwizowany, HAXto „zachowaj linki twarde, listy ACL i atrybuty rozszerzone”.
Chris Down