Como mover um diretório, arquivo por arquivo? (em vez de "copiar e remover")

20

Meu computador tem uma unidade de 500 GB.

Eu quero mover 400 GB de dados de /unencrypted para /encrypted .

Ambos os diretórios estão na mesma partição, mas /encrypted é tratado por ecryptfs , portanto mv /uncrypted/* /encrypted :

  1. Copiar todos os arquivos para o destino
  2. Depois, remova-os da fonte

... que eu não posso pagar, porque requer 800GB.
Se os arquivos fossem movidos um a um, não haveria problema (a zona ecryptfs é dinâmica).

Existe uma opção mv ou outra ferramenta que move um diretório arquivo por arquivo?
Há um grande número de arquivos, portanto, o ARG_MAX pode ser um problema para soluções baseadas em scripts.

    
por Nicolas Raoul 16.05.2013 / 07:27

1 resposta

20

Se você tiver rsync (remova --dry-run para fazer isso de verdade):

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

Caso contrário, usando bash4 + e 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

Para executá-lo de verdade, remova echo de cada comando.

    
por 16.05.2013 / 08:53