Linux altında belirli bir boyuta nasıl dosya kesilir?


19

Bir dosyanın boyutunu kaba kuvvetle küçültmek istiyorum, yani geri kalanını umursamıyorum, sadece dosyayı yarı yarıya kesmek ve geri kalanını atmak istiyorum.

Akla ilk gelen şey Perl'in kesilmesidir . Bu sayfadaki örneği takip ediyorum ve aynı şeyi yaptım:

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

Ancak dosya hala aynı boyutta:

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

Bunu nasıl yapabilirim?

Yanıtlar:


62

Truncate komutunu kullanmak isteyebilirsiniz :

truncate --size=1G test.txt

BOYUT bayt, KB, K, MB, M, vb olarak belirtilebilir. İstediğiniz boyutu elle hesaplayabileceğinizi varsayıyorum; değilse, büyük olasılıkla dosyanın geçerli boyutu hakkında bilgi almak için stat komutunu kullanabilirsiniz.


Coreutils belgelerinden (bilgi formatında).
Cristian Ciupitu

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

dosyayı okumak için açar. Ancak, dosyayı kısaltmak için dosyayı değiştirmeniz gerekir, bu nedenle salt okunur bir dosya tanıtıcısı çalışmaz. "Değiştir" modunu kullanmanız gerekir ( "+>").

Bir yan konu olarak, insanlar sistem çağrılarının sessizce başarısız olmasına izin verdiğinde ve neyin yanlış gittiğini sorduğunda her zaman beni şaşırtıyor. Bir sorunu teşhis etmenin önemli bir kısmı üretilen hata mesajına bakmaktır; anlamasanız bile, yardım isteyenler için hayatı çok daha kolay hale getirir.

Aşağıdakiler biraz daha yararlı olurdu:

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

itiraf etmekle birlikte, bu sadece "geçersiz argüman" rapor olurdu. Yine de, bu yararlı bir bilgidir ve sizi açık modun yanlış olduğu sonucuna götürmüş olabilir (benim için olduğu gibi).


3

tailSon 100000 baytı kesmek için kullanabilirsiniz , örnek:

tail -c 100000 dosya> dosya2

-c, daha fazla seçenek için dosyanın son 100000 baytını çıkarır:

adam kuyruğu

Orijinal dosyayı yeni oluşturduğunuz dosyayla değiştirmek için:

mv dosya2 dosyası


2

Kesilmeye değinilen cevap güzel. gg ayrıca işi yapar:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
Anahtar deyim "verilen bir boyuta" diyelim, 1000 deyin. Bunun yerine en çok oyu alanın cevabını değiştireceğim, bu da anında girişte işe yarar - ara dosyaya gerek yok.
xpt

0

ed programını kullanarak bash ile bunu yapmanın tamamen farklı bir yolu var. aşağıdaki komut dosyası, belirtilen dizinde oturan tüm dosyaların yalnızca son 5000 satırını korur. bu, birkaç dizin üzerinde döngü yapmak, satır sayısını değiştirmek vb. için kolayca değiştirilebilir.

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.