17 votos

¿Por qué un directorio copiado con el comando cp es más pequeño que el original?

Estoy atando a copiar un directorio con un gran número de archivos a otro destino. Yo:

cp -r src_dir another_destination/

Entonces yo quería confirmar que el tamaño del directorio de destino es el mismo que el original:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Entonces tuve un pensamiento que puede haber varios enlaces simbólicos que no son seguidos por el cp comando y se añade el -a flag:

-una Misma -pPR opciones. Conserva la estructura y los atributos de los archivos, pero no la estructura de directorios.

cp -a src_dir another_destination/

pero du -s me dio los mismos resultados. Es interesante que tanto el de origen y de destino tienen el mismo número de archivos y directorios:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

¿Qué estoy haciendo mal que obtengo de diferentes tamaños con el du comando?

ACTUALIZACIÓN

Cuando trato de entrar tamaño de cada uno de los directorios con el du comando puedo obtener diferentes resultados:

du -s src_dir/sub_dir1
1112    src_dir/sub_dir1

du -s another_destination/src_dir/sub_dir1
1168    another_destination/src_dir/sub_dir1

Cuando puedo ver los archivos con ls -la, individuales tamaños de los archivos son los mismos, pero los totales son diferentes:

ls -la src_dir/sub_dir1
total 1168
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

ls -la another_destination/src_dir/sub_dir1
total 1112
drwxr-xr-x     5 hirurg103  staff     160 Jan 30 20:58 .
drwxr-xr-x  1109 hirurg103  staff   35488 Jan 30 21:43 ..
-rw-r--r--     1 hirurg103  staff  431953 Jan 30 20:58 file1.pdf
-rw-r--r--     1 hirurg103  staff  126667 Jan 30 20:54 file2.png
-rw-r--r--     1 hirurg103  staff    7386 Jan 30 20:49 file3.png

21voto

Matija Nalis Puntos 664

Eso es porque du se muestra por defecto no es el tamaño de los archivo(s), pero el espacio en disco que se está utilizando. Usted necesidad de utilizar el -b opción para obtener la suma de los tamaños de archivo, en lugar del total de espacio de disco utilizado. Por ejemplo:

% printf test123 > a
% ls -l a
-rw-r--r-- 1 mnalis mnalis 7 Feb  1 19:57 a
% du -h a
4,0K    a
% du -hb a
7       a

Aunque el archivo es de sólo 7 bytes de largo, que ocupará toda una 4096 bytes de espacio en disco (en mi ejemplo particular; va a variar dependiendo del sistema de ficheros utilizado, el tamaño de los clústeres, etc).

Además, algunos sistemas de archivos soportan los llamados archivos dispersos, que no utilizan ningún espacio en disco de los bloques que son todos ceros. Por ejemplo:

% dd if=/dev/zero of=regular.bin bs=4k count=10
10+0 records in
10+0 records out
40960 bytes (41 kB, 40 KiB) copied, 0,000131003 s, 313 MB/s
% cp --sparse=always regular.bin sparse.bin
% ls -l *.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 regular.bin
-rw-r--r-- 1 mnalis mnalis 40960 Feb  1 20:04 sparse.bin
% du -h *.bin
40K     regular.bin
0       sparse.bin
% du -hb *.bin
40960   regular.bin
40960   sparse.bin

En resumen, para verificar que todos los archivos se copian, se utilizaría du -sb en lugar de du -s.

11voto

jcaron Puntos 238

Puede deberse a que el tamaño de la carpeta "archivos".

En la mayoría de los sistemas de ficheros en el disco, un directorio es mucho como un archivo normal (con sólo una lista de nombres y números de nodo, en su mayoría), el uso de más bloques a medida que crece.

Si agrega muchos archivos, el directorio de sí mismo crece. Pero si retirarlos posteriormente, en muchos sistemas de archivos, el directorio no se reducirá.

Así que si uno de los directorios en su árbol original había muchos archivos en algún momento, que más tarde fueron eliminados, la copia del directorio será "menor", ya que sólo usa tantos bloques como sea necesario para que el número actual de los archivos.

En las listas de su actualización, hay 3 directorios aún no aparece. Comparar el tamaño de esos (o descendientes de aquellos) en su ls -al de salida.

Para encontrar donde la diferencia es, usted puede tratar de un ls -alr en ambos directorios, redirige a un archivo y, a continuación, un diff de las dos salidas.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: