Як спорожнити ("усікати") файл на Linux, який вже існує і якийсь спосіб захищений?


113

У мене на сервері є файл під назвою error.log, який мені потрібно часто врізати. У мене є права доступу до файлу. Відкриття файлу in vi> видалення всього вмісту> збереження робіт (очевидно). Але коли я спробую нижче

cat /dev/null > error.log

Я отримую повідомлення

File already exists.

Очевидно, що на сервері зроблена якась конфігурація, щоб запобігти випадковому перезапису файлів. Хтось може сказати, як я "усічую" файл однією командою?


2
Для незахищеного файлу усікає файл -s 0.
Прамод

Відповіді:


158

У вас noclobberопція встановлена. Помилка виглядає так, що це з csh, тому ви зробите:

cat /dev/null >! file

Якщо я помиляюся і ви використовуєте bash, вам слід зробити:

cat /dev/null >| file

в bash, ви також можете скоротити це до:

>| file

Ви маєте рацію, що оболонка є csh. Звідки ти це знав?
Sumeet Pareek

6
@Wikidkaka - на основі повідомлення про помилку. csh в моїй системі дає аналогічну File existsпомилку, в той час як bash видає зовсім іншу cannot overwrite existing fileпомилку.
R Самуїл Клачко

6
@Jarmund - оскільки у користувача встановлений noclobber, >fileвін не працює.
R Самуїл Клачко

Яка різниця між > fileі >| file?
Буде

1
@Will - якщо у вас є noclobberпараметр, спроба переспрямування на існуючий файл не вдається. Щоб змінити певне переспрямування, залишаючи ноклоббер увімкненим, ви можете використовувати>|
R Самуїл Клачко

71

Ви також можете використовувати функцію скорочення

$truncate -s0 yourfile

якщо в дозволі відмовлено, використовуйте sudo

$sudo truncate -s0 yourfile

Довідка / Посібник: людина усікає

перевірена на ubuntu Linux


1
усікання також торкається часу модифікації файлу - при цьому "> файл" не торкається, якщо файл не змінюється.
dsteinkopf

Він не звільняє дисковий простір, який містить файл. Спочатку він показує 0 байт. Але коли ви щось записуєте у цей файл, розмір файлу = до усікання + новий розмір даних.
Анікет Кулкарні

48

Цього буде достатньо, щоб розмір файлу встановив 0:

> error.log

6
насправді це не працює з noclobber (тестував його сам), тому в цьому випадку це НЕ допустиме рішення ("-bash: error.log: не може замінити існуючий файл"); див. коментар вище ("@Jarmund - оскільки у користувача встановлений noclobber,> файл не працює."). Мені просто цікаво, що за "розумні люди" викликають, очевидно, неправильні відповіді, як це ...

9

заслуга мого старшого колеги за це:

:> filename

Це не порушить файли журналів, тому ви навіть можете використовувати його, наприклад, у syslog.


8
Будь ласка, поясніть. Як це працює? Що це робить нотацією?
користувач31986

2
@ user31986 :- це команда без ефектів (майже коментар), тоді >це переадресація як завжди, тому це просто перенаправляє відсутність виводу з команди, яка нічого не робить у файл. Якщо ввімкнено noclobber, вам потрібно :>| filename(bash) (і я вважаю, що :>! filenameв csh передбачається, що csh має :).
Rhubbarb

4

false | tee fileToTruncate

може також працювати


Це просто нерозумно. Або, якщо це корисно, незрозуміло, ddщоб отримати вихід, нічого не було б навіть краще, ніж звичайне для читання false?
трійка

2

Оскільки судо не працюватиме з перенаправленням > , мені подобається teeкоманда для цієї мети

echo "" | sudo tee fileName

ну, насправді це так, як описано як у згаданому вами питанні, так і вище. "sudo sh -c '> error.log'" ...

це залежить від дозволів на цільовому файлі error.log, якщо це вже можна записати, не потрібно sudo. Я думаю, що інша проблема полягає в тому, що ти передаєш команду як аргумент рядка sh, я не знаю, як це обробляється внутрішньо, але це ще один шар складності / перенаправлення додано
sakhunzai

1
Це фактично не буде усікати файл, оскільки echo ""додасть новий рядок. Ви можете використовувати echo -n ""для придушення нового рядка
Seb

0

Кожен може спробувати цю команду для врізання будь-якого файлу в системі Linux

Це, безумовно, буде працювати в будь-якому форматі:

truncate -s 0 file.txt


-4

Ви також можете спробувати:

echo -n > /my/file


8
Бачите відповідь тоною голосів? Спробуйте прочитати його і подивіться, noclobberа потім запитайте, чи має ваша відповідь взагалі якийсь сенс.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.