Warum ist ein mit dem Befehl cp kopiertes Verzeichnis kleiner als das Original?

18

Ich möchte ein Verzeichnis mit einer großen Anzahl von Dateien an ein anderes Ziel kopieren. Ich tat:

cp -r src_dir another_destination/

Dann wollte ich bestätigen, dass die Größe des Zielverzeichnisses mit der des Originals übereinstimmt:

du -s src_dir
3782288 src_dir

du -s another_destination/src_dir
3502320 another_destination/src_dir

Dann hatte ich den Gedanken, dass es mehrere symbolische Links geben könnte, denen der cpBefehl nicht folgt, und fügte das -aFlag hinzu :

-a Entspricht den Optionen für -pPR. Erhält die Struktur und Attribute von Dateien, jedoch nicht die Verzeichnisstruktur.

cp -a src_dir another_destination/

aber du -sgab mir die gleichen Ergebnisse. Es ist interessant, dass sowohl die Quelle als auch das Ziel die gleiche Anzahl von Dateien und Verzeichnissen haben:

tree src_dir | wc -l
    4293

tree another_destination/src_dir | wc -l
    4293

Was mache ich falsch, dass ich mit dem duBefehl unterschiedliche Größen bekomme ?

AKTUALISIEREN

Wenn ich mit dem duBefehl versuche, die Größe einzelner Verzeichnisse zu ermitteln, erhalte ich unterschiedliche Ergebnisse:

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

Wenn ich Dateien mit ls -laansehe, sind die einzelnen Dateigrößen gleich, aber die Gesamtsummen sind unterschiedlich:

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
Hirurg103
quelle
1
Interessante Frage. Sind die Quelle und das Ziel unterschiedliche Laufwerke / ich wickle, wenn dies auf die Blockgröße der Dateisysteme ankommt.
Davidgo
Hallo @davidgo, die Quelle und das Ziel sind unterschiedliche Verzeichnisse auf demselben Laufwerk. Ich habe die Frage mit ls -laErgebnissen aktualisiert . Siehe UPDATE
Hirurg103
2
Welches Dateisystem? Es kann sein, dass die Verzeichnisse selbst größer sind (mehr Platz beanspruchen) als sie sein müssen. Vergleichen Sie diese Frage . Neue Verzeichnisse, die von erstellt wurden, cpsind genau so groß wie sie sein müssen.
Kamil Maciorowski
Verwenden Sie ls -lsdiese Option , um festzustellen , wie viel Speicherplatz die Dateien belegen.
Barmar
1
recursive md5sum ist Ihr Freund, wenn Sie überprüfen müssen, ob alle Dateien tatsächlich kopiert wurden und der Inhalt identisch ist. rsync ist ein weiteres Tool, mit dem ganze Strukturen und Dateien kopiert und überprüft werden können. Außerdem wird der Prozess beschleunigt, wenn einige Dateien bereits vorhanden sind.
GoFundMonica - codidact.org

Antworten:

21

Dies liegt daran, dass dustandardmäßig nicht die Größe der Datei (en) angezeigt wird, sondern der von ihnen verwendete Speicherplatz. Sie müssen die -bOption verwenden, um die Summe der Dateigrößen anstelle des gesamten verwendeten Speicherplatzes abzurufen. Beispielsweise:

% 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

Obwohl die Datei nur 7 Byte lang ist, belegt sie insgesamt 4096 Byte Festplattenspeicher (in meinem speziellen Beispiel; dies hängt vom verwendeten Dateisystem, der Clustergröße usw. ab).

Einige Dateisysteme unterstützen auch so genannte Sparse-Dateien, die keinen Speicherplatz für Blöcke verwenden, die ausschließlich Nullen sind. Beispielsweise:

% 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

Kurz gesagt, um zu überprüfen, ob alle Dateien kopiert wurden, verwenden Sie du -sbstatt du -s.

Matija Nalis
quelle
1
nicht nur spärliche dateien, sondern auch komprimierte dateien und inline-dateien / residente
dateien führen
1
Und seltsame Ergebnisse auf BTRFS / ZFS.
Val sagt Reinstate Monica
2
@val: Die BTRFS-Komprimierung wirkt sich nicht auf die duAusgabe aus. Dadurch werden komprimierte Dateien für Programme, die den üblichen Algorithmus der Länge verwenden, spärlich dargestellt! = verwendete Blöcke. btrfs.wiki.kernel.org/index.php/…
Peter Cordes
@PeterCordes Aber CoW-Zeug macht die Ausgabe ziemlich sinnlos.
Val sagt Reinstate Monica
Was ist mit doppelten Dateien? Können moderne Systeme nicht Platz sparen, indem sie doppelte Inhalte erkennen?
FreeSoftwareServers
12

Dies kann an der Größe des Verzeichnisses "files" liegen.

In den meisten Dateisystemen auf der Festplatte ähnelt ein Verzeichnis einer regulären Datei (meist nur eine Liste mit Namen und Knotennummern), wobei mehr Blöcke verwendet werden, wenn sie größer werden.

Wenn Sie viele Dateien hinzufügen, vergrößert sich das Verzeichnis. Wenn Sie sie jedoch später entfernen, wird das Verzeichnis in vielen Dateisystemen nicht verkleinert.

Wenn also eines der Verzeichnisse in Ihrem ursprünglichen Baum zu einem bestimmten Zeitpunkt viele Dateien enthielt, die später gelöscht wurden, ist die Kopie dieses Verzeichnisses "kleiner", da nur so viele Blöcke verwendet werden, wie für die aktuelle Anzahl von Dateien erforderlich sind.

In den Einträgen in Ihrem Update befinden sich 3 Verzeichnisse, die Sie nicht aufgelistet haben. Vergleichen Sie die Größe dieser (oder ihrer Nachkommen) in Ihrer ls -alAusgabe.

Um herauszufinden, wo der Unterschied liegt, können Sie ls -alrin beiden Verzeichnissen ein und anschließend eine diffder beiden Ausgaben versuchen .

jcaron
quelle
1
Guter Fang für eine andere Möglichkeit! Im Falle von OPs ist cp -a src_dir another_destination/es jedoch unwahrscheinlich, another_destionationdass sie neu erstellt und somit optimiert werden, während sie src_dir(die möglicherweise größere Verzeichnisse aus früheren Erstellungs- / Ergänzungsvorgängen hatten) tatsächlich größer als erforderlich sein könnten. Die Ergebnisse zeigen jedoch, dass src_dirdas tatsächlich kleiner ist ( 1112 < 1168).
Matija Nalis
@MatijaNalis Nur das erste Beispiel nach "Update" zeigt, dass (1112 <1168) ... das folgende Beispiel die Zahlen umgekehrt hat, und das erste Beispiel zeigt auch die Quelle größer (3782288 vs. 3502320). Möglicherweise ein Tippfehler von OP?
TripeHound
> In the listings in your update, there are 3 directories you haven't listed. Eigentlich sind es Dateien, keine Verzeichnisse. Siehe die Dateinamen > if one of the directories in your original tree had many files at some point, which were later deleted. Ich habe das Quellverzeichnis von einem Remote-Server mit dem Befehl rsync kopiert und nichts davon gelöscht
Hirurg103
1
@ Hirurg103 Die .Einträge zeigen 5 Links auf der Inode. Eine ist die Verknüpfung vom übergeordneten Verzeichnis zu diesem. Ein anderer ist .. Es gibt 3 weitere Links, die ..Links aus Unterverzeichnissen sein sollten. Es sei denn, ich vermisse etwas sehr Seltsames, es müssen 3 Unterverzeichnisse in diesen sein. Wollen Sie damit sagen, dass diese Auflistungen die volle Ausgabe sind?
jcaron