Jak dołączyć określoną liczbę pustych bajtów do pliku? [Zamknięte]

26

Mam skrypt, który zapisuje kilka plików, ale potrzebuję ich określonego rozmiaru. Zastanawiam się więc, czy istnieje sposób na dodanie określonej liczby bajtów zerowych do pliku przy użyciu standardowych narzędzi wiersza poleceń (np. Przez skopiowanie z /dev/zero)?

incognito2
źródło
1
To pytanie wydaje się nie na temat, ponieważ dotyczy programowania, które należy do przepełnienia stosu .
Jenny D mówi Przywróć Monikę
Czy oflag=appenddziała dla ciebie?
Mark K Cowan
Aby wyjaśnić komentarz @Mark K Cowan; ma na ddmyśli polecenie.
Alexander Pozdneev,
Wydaje się, że FYI fallocateto kolejna możliwość wstawiania dziur w pliku. superuser.com/a/1172904/111432
akostadinov,

Odpowiedzi:

41

truncatejest znacznie szybszy niż dd. Aby powiększyć plik o 10 bajtów, użyj:

 truncate -s +10 file.txt 
Kamień
źródło
2
Jest znacznie szybszy, ponieważ wygeneruje rzadki plik, który jest tym, czego chcesz przez większość czasu - ale jeśli nie chcesz rzadkiego pliku, podejście dd będzie działać.
derobert
34

Możesz także tego spróbować

dd if=/dev/zero bs=1 count=NUMBER >> yourfile

Odczyta to z / dev / zero i dopisze do twojego pliku NUMBER bajtów.

Can Kavaklıoğlu
źródło
7

Poniżej znajduje się przykład dodania 10 MB do pliku przy użyciu tylko dd.

[root@rhel ~]# cp /etc/motd ./test
[root@rhel ~]# hexdump -C test |tail -5
000003e0  0a 0a 3d 3d 3d 3d 3e 20  54 65 78 74 20 6f 66 20  |..====> Text of |
000003f0  74 68 69 73 20 6d 65 73  73 61 67 65 20 69 73 20  |this message is |
00000400  69 6e 20 2f 65 74 63 2f  6d 6f 74 64 20 3c 3d 3d  |in /etc/motd <==|
00000410  3d 3d 0a                                          |==.|
00000413

[root@rhel ~]# dd if=/dev/zero of=/root/test ibs=1M count=10 obs=1M oflag=append conv=notrunc
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0208541 s, 503 MB/s

[root@rhel ~]# hexdump -C test |tail -5
00000410  3d 3d 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |==..............|
00000420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00a00410  00 00 00                                          |...|
00a00413
Andrey Arapov
źródło
5

moim pierwszym przypuszczeniem byłoby:

dd if=/dev/zero of=myfile bs=1 count=nb_of_bytes seek=$(stat -c%s myfile)

Zasadniczo to polecenie każe dd „iść” na końcu pliku i dodać niektóre bajty wcześniej odczytane z / dev / zero.

Pozdrowienia,

Jeremy
źródło
2
cat "your file" /dev/zero | head -c "total number of bytes"

lub

head -c "number of bytes to add" /dev/zero >> "your_file"

i aby łatwiej obliczyć rozmiar:

head -c $(( "total number of bytes" - $(stat -c "%s" "your_file") )) /dev/zero >> "your_file"
jfg956
źródło
0

Jeśli uzupełniasz plik bajtami zerowymi, domyślam się, że manipulujesz plikiem w char *C. W takim przypadku może nie być konieczne wypełnianie pliku bajtami zerowymi, dodając tylko bajt zerowy na końcu pliku, a następnie wypełnienie go losowymi bajtami może wystarczyć. W takim przypadku poniżej program w C byłby bardzo wydajny (do użycia tylko w plikach mniejszych niż drugi parametr, w przeciwnym razie dane zostałyby nadpisane). Może nawet zrobić to, co chcesz (wypełnienie pustymi bajtami), ponieważ lseekdefinicja funkcji stwierdza, że:

Funkcja lseek () umożliwia ustawienie przesunięcia pliku poza koniec istniejących danych w pliku. Jeśli w tym momencie dane zostaną później zapisane, kolejne odczyty danych w szczelinie zwracają bajty o wartości 0, dopóki dane nie zostaną faktycznie zapisane w szczelinie.

W takim przypadku pierwsze połączenie z lseeki writemoże zostać usunięte. Ale testy powinny być wykonane na twoim systemie 1 ...

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

/* 1st parameter: a file name, 2nd parameter: a file size. */
int main(int argc, char ** args) {
   int nfd = open(args[1], O_WRONLY);
   lseek(nfd, 0, SEEK_END);
   write(nfd, "\0", 1);
   lseek(nfd, atoi(args[2]) - 1, SEEK_SET);
   write(nfd, "\0", 1);
   close(nfd);
   return 0;
}
jfg956
źródło