Как очистить текст в файле?

Как очистить текст, который существовал в текстовом файле, не открывая его?

Я имею в виду, например, что у меня есть файл в виде hello.txt с некоторыми текстовыми данными в нем, и как я могу очистить весь текст в этом файле не открывая его?

Под этим я подразумеваю отказ от использования каких-либо редакторов, таких как nano, Gedit и т.д.

Просто откройте свой терминал с помощью CTRL+ALT+Tи введите как

 > hello.txt

вот и все, ваши данные в этом файле будут удалены даже без его открытия.

Пример:

enter image description here

Самый простой способ усечения файла - перенаправить вывод команды shell no-op (:) к файлу, который вы хотите стереть.

: > hello.txt

Мне приходится постоянно делать это с файлами журналов. Самый простой способ, который я нашел, - это выполнить следующую команду:

cat /dev/null > hello.txt

Это удаляет все содержимое файла и оставляет вас с пустым файлом без необходимости открывать его в редакторе, выделять текст и тому подобное. Более конкретно, что он делает, так это заменяет содержимое файла содержимым "/dev /null" или ничего. На самом деле это довольно ловко.

Единственное предостережение заключается в том, что пользователь, под именем которого вы в данный момент вошли в систему, должен иметь разрешение на запись в указанный файл.

Я также собираюсь использовать перенаправление, подобное ответу раджагенупулы. Но здесь немного больше гибкости. Откройте терминал и введите,

cat > hello.txt

И нажмите Ctrl+C. Это приведет к удалению предыдущего файла. Если вы хотите до такой степени, это прекрасно.

Если вы хотите, вы можете сделать что-то еще после удаления файла. Таким образом, вы можете не только стереть файл, не открывая его, но и написать в файле несколько строк с правильным форматированием. Допустим, вы хотите написать "Ubuntu - лучшая ОС" после удаления файла, просто сделайте

cat > hello.txtUbuntu is the best OS

Затем нажмите Ctrl+C. Теперь предыдущий файл будет удален. В то же время слова находятся там в двух строках, как я их ставлю.

Смотрите пример:

enter image description here

Другой подход - cp то /dev/null к файлу

xieerqi:$ cat testFile.txt                                                                                        Filesystem     1K-blocks     Used Available Use% Mounted on/dev/sda1      115247656 83100492  26269816  76% /none                   4        0         4   0% /sys/fs/cgroupudev             2914492        4   2914488   1% /devtmpfs             585216     1152    584064   1% /runnone                5120        0      5120   0% /run/locknone             2926072    98096   2827976   4% /run/shmnone              102400       76    102324   1% /run/userxieerqi:$ cp /dev/null testFile.txt                                                                               xieerqi:$ cat testFile.txtxieerqi:$ 

Почему это работает и как это работает? То testFile.txt будет открыт с O_WRONLY|O_TRUNC флаги, что означает, что если файл существует - он будет усечен, что означает, что содержимое отброшено, а размер установлен на ноль. Это тот же флаг, с которым > оператор в командной оболочке открывает файл справа от этого оператора.

Следующий, cp попытается прочитать из /dev/null и после чтения 0 байт просто закроет оба файла, тем самым оставив testFile.txt усечено, а содержимое эффективно удалено.

Зная это, мы теоретически могли бы использовать все, что позволяет нам открывать файл с O_TRUNC. Например, это:

dd of=testFile.txt count=0

Небольшая разница здесь заключается в том, что dd не будет выполнять никаких read() вообще. Большой плюс этого dd версия заключается в том, что она легко переносима. То технические характеристики dd государство:

Если преобразование seek= expr также не указано, выходной файл должен быть усечен до начала копирования, если указан явный операнд of= file, если не указано conv= notrunc.

По контрасту cp /dev/null testFile.txt не обязательно переносим, поскольку Спецификации POSIX для cp рассмотрим, что происходит, только если source_file нерегулярен и когда -r/-R флаги указаны (большое спасибо Стивен Китт за то, что указал на это), но не то, что происходит, когда -r или -R опущены, как и в данном случае. Однако, похоже, по крайней мере, GNU cp по умолчанию используется правило 3 в той же спецификации, которое усекает существующий файл без изменения его типа.

Если файл был создан с именем hello.txt и был снабжен некоторыми текстами, а затем приведенной ниже командой в терминалеctrl+alt+t удалит весь текст в hello.txt файл,

echo "" > hello.txt

enter image description here

Не самый короткий ответ, но...

Этот ответ основан на другом из Суперпользователь. Хотя и не самая короткая команда bash, truncate является наиболее читаемым для обычных новичков:

$ echo Hello > Hello.txt$ echo World! >> Hello.txt$ cat Hello.txtHelloWorld!$ truncate -s 0 Hello.txt$ ll Hello.txt-rw-rw-r-- 1 rick rick 0 Mar 20 17:32 Hello.txt

Параметры, используемые с truncate командуй здесь:

  • "-s" установите размер
  • размер "0" будет равен нулю

Очистите все, кроме первых 10 000 байт

Преимущество в truncate то есть вы можете указать, сколько оставить, а не просто ноль:

$ truncate -s 10000 Hello.txt

... усечет все после первых 10 000 байт. Это может быть полезно, если программа сошла с ума и сбросила много мегабайт данных в небольшой файл журнала:

  • Запустите программу truncate команда для разумно большего нормального размера в 10 КБ
  • Откройте файл с помощью текстового редактора и нажмите End
  • Выделить и PgUp чтобы удалить оставшиеся байты, которые не принадлежат (обычно распознаются по символам мусора ASCII).
vi filename -c ':1,$d' -c ':wq'

работал лучше всего для меня из-за особого разрешения, которое у него было

Итак, я вижу, что для ответа на этот вопрос используется много перенаправлений ;)

Немного другой подход к комбинированному: rm & touch

rm hello.txt && touch hello.txt

(да... еще один обман!)

Итак, с помощью этой комбинации команд файл hello.txt не был открыт и в конце концов у вас все еще есть файл hello.txt на свое место с очищенным содержимым. Как ты и хотел!

Что вы подразумеваете под “открытием” файла? Во всех ответах, данных до сих пор, файл по-прежнему будет открыт для записи оболочкой. В конце концов, оболочка - это такая же программа, как и любая другая.

Я согласен с комментарием Джеффа… У меня тоже есть мнение*, что файловый поток должен быть открыт для записи в него, независимо от того, используете ли вы какие-либо текстовые редакторы или перенаправление. (_* ценю, что кто-нибудь предложил ссылки, чтобы помочь в этом вопросе _)

@Jeff не использует такие вещи, как nano, gedit и т.д.

Hus787 Я еще не набрал, чтобы попасть туда, если вы так думаете, иначе я приветствую ваш интерес к моему вопросу.