1. 概要

Linuxコマンドラインからファイルのコンテンツのみをすばやくクリアして、空のファイルを保持したい場合があります。

このチュートリアルでは、それを実現する方法を見てみましょう。

2. 問題の紹介

いつものように、例を通して問題を理解しましょう。 空でないテキストファイルがあるとしましょう。

$ cat input.txt
Hi there,
   I'm not an empty file.
Bye.

ここで、 input.txt ファイルの内容をクリアしますが、ファイルは保持します。 したがって、最終的には、ファイルが空になると予想されます。

これを確認するには、 wc コマンドを使用して、ファイルのバイト数を確認します。 ファイルが空の場合、結果として0になるはずです。

$ wc -c input.txt
0 input.txt

次に、ファイルを空にする方法を見てみましょう。

3. コマンドの使用

ターゲットファイルに対していくつかのコマンドを実行することで、この作業を実行できます。 次に、それらの動作を見てみましょう。

通常、Linuxでファイルをコピーするにはcpコマンドを使用します。 また、 / dev /nullはすべてのLinuxシステムに存在する特別なファイルであることがわかっています。 通常、は、プロセスの不要な出力ストリームを破棄するため、または入力ストリーム用の便利な空のファイルとして/ dev/nullを使用します。

したがって、/dev/nullinput.txtにコピーして、ターゲットファイルを空にすることができます。

$ cp /dev/null input.txt 
$ wc -c input.txt
0 input.txt

上記の出力が示すように、ファイルは空になります。

sedは強力なテキスト処理ユーティリティです。 インプレース変更機能をサポートします。 たとえば、GNUSedで-i オプションを使用して、インプレース変更を行うことができます。

したがって、 sedを使用して、指定されたファイルからすべてをインプレースで削除できます。 input.txt ファイルを復元して、その方法を見てみましょう。

$ sed -i 'd' input.txt 
$ wc -c input.txt
0 input.txt

上記のsedコマンドが示すように、sedの「d」コマンドのみを使用して、input.txtからすべてを削除します。

Linuxでは、コマンド truncate は、ファイルを指定されたサイズに縮小または展開します。 したがって、ファイルをサイズ「0」に切り捨ててコンテンツをクリアすることができます

$ truncate -s 0 input.txt 
$ wc -c input.txt
0 input.txt

4. リダイレクトの使用

これまで、さまざまなコマンドを使用してinput.txtファイルをクリアしてきました。 または、Linuxでは、IOリダイレクトを使用してファイルのコンテンツを変更できます。

たとえば、 / dev / null は空の入力を提供することがわかっているので、コマンド「cat / dev / null」の出力をターゲットファイルにリダイレクトして、その内容をクリアできます

$ cat /dev/null > input.txt
$ wc -c input.txt
0 input.txt

同様に、echoの出力をターゲットファイルにリダイレクトできます。

$ echo -n '' > input.txt
$ wc -c input.txt 
0 input.txt

言及する価値があります -nオプションが必要です。 それ以外の場合、ファイルは空ではありません。 代わりに、末尾の改行が含まれます

$ echo '' > input.txt
$ wc -c input.txt
1 input.txt

ご覧のとおり、リダイレクトを使用してファイルを空にするコマンドは非常にコンパクトです。 次に、それを行うためのさらにいくつかの簡単な方法を調べてみましょう。

「:> FILE」は、FILEを長さゼロに切り捨てることができます

$ : > input.txt
$ wc -c input.txt
0 input.txt

上記のコマンドの「」はダミーコマンドとして機能し、出力を生成しません。

Bashを使用している場合は、コロン文字を保存することもできます。

$ > input.txt
$ wc -c input.txt 
0 input.txt

ただし、注意する必要がありますこれはすべてのシェルで機能するわけではありません。 たとえば、Zshでは機能しません

Zshでは、「:>input.txt」を使用できます。

5. sudoが必要な場合

さまざまな方法でファイルを空にする方法を学びました。 これまでのところ、すべての例で、現在のログインユーザーがinput.txtファイルへの「書き込み」権限を持っていると想定しています。

次に、現在のユーザーに書き込み権限がないファイルを空にする方法を見てみましょう。

sudo を使用すると、スーパーユーザーの許可を得てコマンドを実行できることがわかっています。 したがって、ユーザーが sudo を使用できると仮定すると、sudoを使用してターゲットファイルをクリアできます。 例を見てみましょう:

$ ls -l input_super.txt
-rw-r--r-- 1 root root 41 Apr 18 15:56 input_super.txt

ls コマンドが示すように、ファイルinput_super.txtの長さは41バイトです。 さらに、ユーザーrootのみが「書き込み」権限を持っています。

コマンドベースのアプローチを使用してファイルを空にすることにした場合、それは簡単です。コマンドの前にsudoを追加するだけです。

$ sudo cp /dev/null input_super.txt
[sudo] password for kent: 

$ wc -c input_super.txt 
0 input_super.txt

上記の例に示すように、cpコマンドをsudoで実行しました。 現在のユーザー( kent )のパスワードを指定すると、ファイルは正常にクリアされます。

ただし、リダイレクトベースの方法でファイルを空にしたい場合は、コマンドの前にsudoを追加するだけでは機能しません

$ sudo echo -n '' > input_super.txt
bash: input_super.txt: Permission denied

sudo を使用したのに、なぜ許可について文句を言うのか不思議に思うかもしれません。 これは、 echo コマンドはスーパーユーザーの許可を得て実行されますが、リダイレクトはファイルinput_super.txtへの書き込み権限がないシェルによって実行されるためです。 。

これを解決するには、 sudo を使用してシェルを実行し、-cオプションを使用してシェルにコマンドを渡します。

$ sudo sh -c "echo -n '' > input_super.txt" 
[sudo] password for kent: 

$ wc -c input_super.txt
0 input_super.txt

6. 結論

この記事では、Linuxでファイルのコンテンツをクリアするための2つのアプローチについて説明しました。

  • sedtruncateなどのコマンドを使用する
  • リダイレクトを使用する

さらに、上記のアプローチをsudo。と一緒に使用する方法についても説明しました。