Як вирізати файл до заданого розміру під Linux?


19

Я хочу зменшити розмір файлу грубою силою, тобто я не переймаюся рештою, просто хочу скоротити файл, скажімо навпіл, а решту відкинути.

Перше, що спадає на думку - це укорочення Перла . Я слідую прикладу на цій сторінці і зробив точно те саме:

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

Але файл все одно має однаковий розмір:

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

Як я можу змусити цю роботу?

Відповіді:


60

Ви можете скористатися командою обрізання :

truncate --size=1G test.txt

РОЗМІР можна вказати у байтах, KB, K, MB, M тощо. Я припускаю, що ви можете обчислити потрібний розмір вручну; якщо ні, ви, ймовірно, можете скористатися командою stat для отримання інформації про поточний розмір файлу.


Його документація (в інформаційному форматі) від coreutils.
Крістіан Цюпіту

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

відкриває файл для читання. Однак для врізання файлу потрібно змінити його, тому обробка файлів, доступних лише для читання, не працюватиме. Потрібно використовувати режим "модифікувати" ( "+>").

Як побічне питання, мене завжди вражає, коли люди дозволяють системні дзвінки виходити з ладу і потім запитують, що пішло не так. Істотна частина діагностики проблеми дивиться на повідомленні про помилку виробництві; навіть якщо ви цього не розумієте, це значно полегшує життя тим, кого ви просите про допомогу.

Наступне було б дещо кориснішим:

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

хоча правда, це повідомило б лише про "недійсний аргумент". Все-таки корисна інформація і цілком може призвести до того, що відкритий режим був неправильним (як це було для мене).


3

Ви можете tailвирізати останні 100000 байт, наприклад:

хвіст -c 100000 файл> file2

-c виводить кінцеві 100000 байт файлу для додаткових опцій:

людина хвіст

Щоб замінити оригінальний файл на щойно створений файл:

mv file2 файл


2

Відповідь вище із цитуванням усікання є приємною. dd також зробить цю роботу:

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

1
Ключова фраза: "до заданого розміру" , скажімо, 1000. Я заміню відповідь на найбільш голосовану замість цього, яка працює на вхід під час руху - не потрібен проміжний файл.
xpt

0

існує зовсім інший спосіб зробити це, використовуючи bash, використовуючи програму ed. наступний скрипт збереже лише останні 5000 рядків усіх файлів, що знаходяться у вказаному каталозі. це можна легко змінити, щоб перейти на декілька каталогів, змінити кількість рядків тощо.

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.