Eu tenho duas árvores de diretório com layouts semelhantes, ou seja,
.
|-- dir1
| |-- a
| | |-- file1.txt
| | `-- file2.txt
| |-- b
| | `-- file3.txt
| `-- c
| `-- file4.txt
`-- dir2
|-- a
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
`-- file9.txt
Gostaria de mesclar as árvores de diretório dir1 e dir2 para criar:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Sei que posso fazer isso usando o comando "cp", mas quero mover os arquivos em vez de copiar, porque os diretórios reais que quero mesclar são muito grandes e contêm muitos arquivos (milhões). Se eu usar "mv", recebo o erro "O arquivo existe" devido a nomes de diretório conflitantes.
ATUALIZAÇÃO: Você pode assumir que não há arquivos duplicados entre as duas árvores de diretório.
Respostas:
Isso criaria hardlinks em vez de movê-los. Você pode verificar se eles foram movidos corretamente e, em seguida, remover
dir1/
edir2/
.fonte
--link-dest
caminho absoluto ou relativo amerged/
; ou ele irá copiar.É estranho que ninguém tenha notado que
cp
tem opção-l
:Você pode fazer algo como
fonte
cp -l
não funcione nos sistemas de arquivos.cp -a
(sinônimo decp -RPp
) para manter todos os atributos dos arquivos e evitar os seguintes links simbólicos: aqui o comando se tornacp -al dir1/* dir2/* merge
.Você pode usar renomear (também conhecido como nome do pacote perl) para isso. Cuidado que o nome não se refere necessariamente ao comando que descrevo fora do debian / ubuntu (embora seja um único arquivo perl portátil, se você precisar).
Você também tem a opção de usar o vidir (do moreutils) e editar os caminhos do arquivo no seu editor de texto preferido.
fonte
Eu gosto das soluções rsync e prename , mas se você realmente quer que o mv faça o trabalho e
-print0
e-depth
,-0
,é possível manipular um grande número de arquivos que podem ter espaços em branco aleatórios em seus nomes, todos com um script de shell no estilo Bourne:
fonte
find . -name '*.torrent' | xargs -d '\n' rm
Força bruta
bash
teste faz isso
fonte
Eu tive que fazer isso várias vezes para árvores de código fonte em diferentes estágios de desenvolvimento. Minha solução foi usar o Git da seguinte maneira:
Você pode refiná-lo com ramificações e assim por diante, mas essa é a idéia geral. E você tem menos medo de empacotá-lo porque possui um instantâneo completo de cada estado.
fonte