Jak wyciąć plik do określonego rozmiaru w systemie Linux?

19

Chcę zmniejszyć rozmiar pliku metodą brute-force, tzn. Nie dbam o resztę, chcę po prostu wyciąć plik, powiedzmy o połowę, i odrzucić resztę.

Pierwszą rzeczą, jaka przychodzi mi na myśl, jest obcięcie Perla . Podążam za przykładem na tej stronie i zrobiłem dokładnie to samo:

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

Ale plik nadal ma ten sam rozmiar:

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

Jak mogę to zrobić?

xpt
źródło

Odpowiedzi:

62

Możesz użyć polecenia skróć :

truncate --size=1G test.txt

ROZMIAR można podać jako bajty, KB, K, MB, M itd. Zakładam, że możesz ręcznie obliczyć żądany rozmiar; jeśli nie, prawdopodobnie możesz użyć polecenia stat, aby uzyskać informacje o bieżącym rozmiarze pliku.

ChrisInEdmonton
źródło
Jego dokumentacja (w formacie informacyjnym) z coreutils.
Cristian Ciupitu
21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

otwiera plik do odczytu. Jednak w celu obcięcia pliku należy go zmodyfikować, aby uchwyt pliku tylko do odczytu nie działał. Musisz użyć trybu „modyfikuj” ("+>" ).

Na marginesie zawsze zadziwia mnie, gdy ludzie pozwalają cicho na wywołania systemowe, a następnie pytają, co poszło nie tak. NaIstotnym elementem diagnozowania problemu patrzy się na komunikat o błędzie wyprodukowane; nawet jeśli tego nie rozumiesz, życie jest znacznie łatwiejsze dla tych, którzy proszą o pomoc.

Następujące byłyby nieco bardziej pomocne:

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

chociaż wprawdzie zgłosiłoby to tylko „nieprawidłowy argument”. Mimo to jest to przydatna informacja i może doprowadzić do wniosku, że tryb otwarty był zły (tak jak dla mnie).

rici
źródło
3

Możesz użyć taildo wycięcia ostatnich 100000 bajtów, przykład:

tail -c 100000 plik> plik2

-c wyświetla końcowe 100 000 bajtów pliku, aby uzyskać więcej opcji:

ogon człowieka

Aby zamienić oryginalny plik na właśnie wygenerowany plik:

plik mv plik2

Ivan Malyshev
źródło
2

Odpowiedź powyżej cytując obcięcie jest miła. dd wykona również zadanie:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt
James Georgas
źródło
1
Kluczową frazą jest „do danego rozmiaru” , powiedzmy 1000. Zamiast tego zmienię odpowiedź na najczęściej głosowaną, która działa na dane wejściowe w locie - nie potrzebujesz pliku pośredniego.
xpt
0

jest na to zupełnie inny sposób, używając bash, używając programu ed. poniższy skrypt zachowa tylko ostatnie 5000 wierszy wszystkich plików znajdujących się w określonym katalogu. można to łatwo zmodyfikować, aby wyświetlać w pętli kilka katalogów, zmieniać liczbę wierszy itp.

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
Richard
źródło