Tengo dos árboles de directorio con diseños similares, es decir
.
|-- 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
Me gustaría fusionar los árboles de directorios dir1 y dir2 para crear:
merged/
|-- a
| |-- file1.txt
| |-- file2.txt
| |-- file5.txt
| `-- file6.txt
|-- b
| |-- file3.txt
| |-- file7.txt
| `-- file8.txt
`-- c
|-- file10.txt
|-- file4.txt
`-- file9.txt
Sé que puedo hacer esto usando el comando "cp", pero quiero mover los archivos en lugar de copiarlos, porque los directorios reales que quiero fusionar son realmente grandes y contienen muchos archivos (millones). Si uso "mv", aparece el error "El archivo existe" debido a los nombres de directorio en conflicto.
ACTUALIZACIÓN: puede suponer que no hay archivos duplicados entre los dos árboles de directorios.
Respuestas:
Esto crearía enlaces duros en lugar de moverlos, puede verificar que se movieron correctamente, luego, elimine
dir1/
ydir2/
.fuente
--link-dest
camino sea absoluto o relativo amerged/
; o lo copiará.Es extraño que nadie haya notado que
cp
tiene opción-l
:Puedes hacer algo como
fuente
cp -l
no funcione en todos los sistemas de archivos.cp -a
(sinónimo decp -RPp
) para mantener todos los atributos de los archivos y evitar los siguientes enlaces simbólicos: aquí se convierte en el comandocp -al dir1/* dir2/* merge
.Puede usar rename (también conocido como prename, del paquete perl) para eso. Tenga en cuenta que el nombre no necesariamente se refiere al comando que describo fuera de debian / ubuntu (aunque es un solo archivo perl portátil si lo necesita).
También tiene la opción de usar vidir (de moreutils) y editar las rutas de archivo desde su editor de texto preferido.
fuente
Me gustan las soluciones de rsync y de nombre , pero si realmente quieres que mv haga el trabajo y
-print0
y-depth
,-0
,entonces es posible manejar una gran cantidad de archivos que pueden tener espacios en blanco al azar en sus nombres, todos con un script de shell estilo Bourne:
fuente
find . -name '*.torrent' | xargs -d '\n' rm
Fuerza bruta
bash
prueba hace esto
fuente
He tenido que hacer esto varias veces para árboles de código fuente en diferentes etapas de desarrollo. Mi solución fue usar Git de la siguiente manera:
Puede refinarlo con ramificaciones, etc., pero esta es la idea general. Y tiene menos miedo de rellenarlo porque tiene una instantánea completa de cada estado.
fuente