Como mover arquivos específicos enquanto preserva sua estrutura de diretórios

3

Eu tenho um diretório grande com muitos arquivos e diretórios em um sistema Windows remoto onde só tenho acesso FTP.

Eu tive que fazer algumas modificações em alguns dos arquivos, então eu baixei o diretório inteiro para executar um comando localizar e substituir em arquivos recursivamente .

Usando o Git localmente, consegui obter a lista de arquivos modificados. (Eles não são Git no sistema Windows, então eu não posso empurrar / puxar. Além disso, eu só tenho acesso FTP.)

Agora preciso atualizar os arquivos no sistema Windows. Fazer upload de arquivo por arquivo manualmente pode ser frustrante, pois há muitos arquivos modificados.
Alguns dos arquivos estão localizados em subdiretórios e subdiretórios.

Por exemplo, essa estrutura (há muito mais arquivos):

./
 |--- file1
 |--- file2
 |--- dir1
 |     |--- file1.1
 |     |--- dir1.1
 |           |---- file1.1.1
 |--- dir2
       |--- file2.1
       |--- file2.2
       |--- file2.3

Como posso copiá-los (ou movê-los é mesmo bom) para um novo local, preservando a estrutura de diretório.
Dessa forma, no meu cliente de FTP, eu apenas moveria a pasta inteira. Ele irá gerenciar a estrutura de diretórios por si só.

Tenha em mente que os subdiretórios têm outros arquivos não modificados, que eu não quero que sejam copiados.

O Git me deu essa lista, então fez metade do trabalho:

file1
file2
dir1/file1.1
dir1/dir1.1/file1.1.1
dir2/file2.1
dir2/file2.2
dir2/file2.3
    
por Dan 16.10.2013 / 12:59

3 respostas

2

Problema interessante. Eu procurei um pouco, então aqui está outra abordagem. Quando você tem uma lista de arquivos e muitos arquivos para upload. Use o wput.

apt-get install wput

cat /you/large/file/list | wput ftp:/host/ -i -

Eu recomendaria ativar a saída detalhada com -v

Da página do manual:

-i file
       --input-file=file
           Reads URLs and filenames from file. ...

Você também pode usar find para enviar nomes de arquivos para o wput.

find | wput ftp://host/ -i -

Mas, cuide dos caracteres de escape da shell na sua lista.

    
por chaos 16.10.2013 / 14:52
2

Por que você não usa curlftpfs ? Acho que seria mais simples fazer upload e baixar toda a estrutura de diretórios.

sudo apt-get install curlftpfs

Monte um sistema de arquivos ftp remoto:

curlftpfs -v user:[email protected]/path/ /mnt/

Em seguida, edite ou modifique o que for necessário e desmonte os fs. Mas note, o sistema de arquivos é muito lento.

Editar: Se a sua senha tiver caracteres especiais como "@", use um arquivo chamado ~/.netrc com o seguinte formato:

machine ftp-server.com
login user
password p@ssword

E monte o fs via:

curlftpfs -v ftp-server.com/path/ /mnt/
    
por chaos 16.10.2013 / 13:42
1

Isso foi o que acabei fazendo, embora, se houver uma maneira melhor, adicione como resposta:

Salvei a lista de arquivos em um arquivo foo.log

e executou o seguinte comando:

tar -zcf bar.tar.gz --files-from foo.log

Ao arquivar com tar , ele mantém a estrutura de diretórios intacta dos arquivos adicionados.

Eu desarquei o arquivo bar.tar.gz em um diretório vazio:

mkdir tempdir
tar -zcf bar.tar.gz -C tempdir
# Delete the archive
rm bar.tar.gz

Agora todos os meus arquivos modificados foram copiados dentro de tempdir

    
por Dan 16.10.2013 / 14:27