Tengo un directorio grande que contiene subdirectorios y archivos que deseo copiar de forma recursiva.
¿Hay alguna manera de decir cp
que debe realizar la operación de copia en orden de tamaño de archivo, de modo que los archivos más pequeños se copien primero?
Respuestas:
Esto hace todo el trabajo de una vez: en todos los directorios secundarios, todo en una sola secuencia sin ningún problema de nombre de archivo. Copiará de menor a mayor cada archivo que tenga. Tendrá que hacerlo
mkdir ${DESTINATION}
si aún no existe.¿Sabes qué? Lo que esto no hace es directorios secundarios vacíos . Podría hacer un poco de redireccionamiento sobre esa tubería, pero es solo una condición de carrera esperando a suceder. Más simple es probablemente el mejor. Entonces haz esto después:
O, dado que Gilles hace un muy buen punto en su respuesta para preservar los permisos de directorio, debería intentarlo también. Creo que esto lo hará:
Estaría dispuesto a apostar que es más rápido que de
mkdir
todos modos.fuente
Aquí hay un método rápido y sucio usando
rsync
. Para este ejemplo, considero que cualquier cosa de menos de 10 MB es "pequeña".Primero transfiera solo los archivos pequeños:
rsync -a --max-size=10m srcdir dstdir
Luego transfiere los archivos restantes. Los archivos pequeños transferidos previamente no se volverán a copiar a menos que se hayan modificado.
rsync -a srcdir dstdir
Desde
man 1 rsync
Por supuesto, el orden de transferencia archivo por archivo no es estrictamente menor a mayor, pero creo que puede ser la solución más simple que cumpla con el espíritu de sus requisitos.
fuente
--copy-dest=DIR
y / o--compare-dest=DIR
creo. Solo sé porque tuve que--hard-dereference
agregarmetar
después de publicar mi propia respuesta porque me faltaban los enlaces. Creo que, dersync
todos modos, se comporta de manera más específica con los otros sistemas de archivos locales: solía usarlo con llaves USB e inundaría el bus a menos que estableciera un límite de ancho de banda. Creo que debería haber usado cualquiera de esos otros en su lugar.No
cp
directamente, eso está más allá de sus habilidades. Pero puede hacer arreglos para llamarcp
los archivos en el orden correcto.Zsh convenientemente permite ordenar archivos por tamaño con un calificador global . Aquí hay un fragmento de zsh que copia archivos en orden creciente de tamaño de abajo
/path/to/source-directory
a abajo/path/to/destination-directory
.En lugar de un bucle, puede usar la
zcp
función. Sin embargo, primero debe crear los directorios de destino, lo que se puede hacer en una línea críptica.Esto no preserva la propiedad de los directorios de origen. Si lo desea, deberá contratar un programa de copia adecuado como
cpio
opax
. Si hace eso, no necesita llamarcp
ozcp
además.fuente
No creo que haya forma
cp -r
de hacerlo directamente. Dado que puede ser un período de tiempo indeterminado antes de obtener una soluciónfind
/ asistenteawk
, aquí hay un script rápido en perl:Utilizar esta:
./whatever.pl /src/path /dest/path
Los argumentos deben ser ambos caminos absolutos ;
~
, o cualquier otra cosa que el shell se expanda a una ruta absoluta está bien.Si agrega un tercer argumento (cualquier cosa, excepto un literal
0
), en lugar de copiarlo, imprimirá al estándar un informe de lo que haría, con tamaños de archivos en bytes antepuestos, por ejemploObserve que estos están en orden ascendente por tamaño.
El
cp
comando en la línea 34 es un comando de shell literal, por lo que puede hacer lo que quiera con los interruptores (solo solía-a
preservar todos los rasgos).File::Find
yFile::Basename
son ambos módulos principales, es decir, están disponibles en todas las instalaciones de perl.fuente
cp - copy smallest files first?
pero el título de la publicación escopy smallest files first?
De todos modos, las opciones nunca duelen es mi filosofía, pero aún así, tú y David son los únicos que usaroncp
y tú eres el único que lo logró.cp
fue porque es la forma más simple de preservar las características del archivo * nix en el perl (orientado a múltiples plataformas). La razón por la que dice la barra de su navegadorcp -
se debe a una función SE (IMO bobo) por la cual la más popular de las etiquetas seleccionadas aparece prefijada al título real.pearl
salir de la carpintería por aquí.otra opción sería usar cp con la salida de du:
Esto aún podría hacerse en una línea, pero lo dividí para que pueda leerlo
fuente