今回はコマンドを使ってテキストファイルの作成や表示を行います。テキストファイル処理のコマンドは数多くありますので、今回は基本となるコマンドを使ってみます。
と書いてみたものの、お気に入りのテキストエディタがあれば、それを使った方が楽です。作成&編集&追加ともとても楽です。特にWindows 95以降GUIが広く使われるようになったのでファイルの処理は格段によくなりました。 GUIでできるなら無理してコマンドを使ってファイルの作成や削除をする必要はないと思います。
では、コマンドを使った方が便利な場合は、どんな時でしょうか。ここらへんは前回のディレクトリの処理と似てますが、連番ファイルを作成するなど特定の条件が伴った時にはコマンドの方が便利です。
テキストファイルを表示する
テキストファイルを表示するにはcatを使うのが定番です。定番、つまりよく使うコマンドなのでPowerShellでもcatはGet-Contentのエイリアスとして定義されています。
catで表示するファイルとして以下のサンプルファイルを用意しました。内容は図の通りで、この連載の目次のリード文章です。
title.txt
lead.txt
index.txt
これらのファイルはデスクトップ上にあるsampleディレクトリ(フォルダ)内に入れてあります。以後の説明では、このsampleディレクトリをカレントディレクトリとして説明します。sampleディレクトリをカレントディレクトリにするにはcd ~/Desktop/sampleとコマンドを入力すればOKです。
それでは、まず3つあるファイルのうちtitle.txtの内容を表示してみます。catの後ろにファイル名を指定するだけです。
cat title.txt
他のファイルもcatの後ろにファイル名を指定すれば表示されます。
ファイル名の部分には以下のようにファイルのパスを指定することもできます。この場合、ユーザーのデスクトップにあるsampleディレクトリ内にあるtitle.txtファイルの内容が表示されます。
cat ~/Desktop/sample/title.txt
catは複数のファイルを指定することもできます。以下のようにするとindex.txt、title.txt、lead.txtの順番に内容が表示されます。なお、PowerShellでは、このような指定をするとエラーになります。以後の説明にある複数ファイルを利用する例ではPowerShellでは動作しません。
cat index.txt title.txt lead.txt
catで順番を指定して表示できる機能を利用すると複数のファイルを1つのファイルとして保存することができます。以下のようにリダイレクト記号の>の後に保存するファイル名(ファイルパス)を指定します。WebならHTMLの生成でヘッダーとボディ、そしてフッターを連結するような用途にも使えます。(実際には使う事はないでしょうけど例として)
cat index.txt title.txt lead.txt > all.txt
>でなく>>を使うと現在のファイルの末尾に追加する形になります。追加するファイルとしてfooter.txtを用意します。が、せっかくなのでテキストエディタで作成するのではなくコマンドラインから作成してみましょう。 footerには更新日(更新日時)を入れることにします。ここでは2020/12/31のようにしてみましょう。この日付の文字を標準出力に出してリダイレクト(>記号)を使ってfooter.txtに保存します。シンプルなところでは以下のようにechoを使う方法があります。
echo 2020/12/31 > footer.txt
正常に書き込まれたかどうかはcatを使って確認できます。
他の方法としてはcatを使うこともできます。catの後にファイル名などを指定せずにリダイレクト記号の>を書き、その後に保存するファイル名を指定します。つまり以下のように指定します。なお、PowerShellでは動作が異なるため、この方法は使えません。
cat > footer.txt
すると文字を入力できる状態になりますので、2020/12/31と入力したら最後にcontrolキーとDキーを押します。するとfooter.txtファイルに入力した内容が保存されます。数行とかちょっとした内容のファイルを作成するにはよいかもしれません。大昔(1970〜80年代)のラインエディタ(すでに死語)だと思えば悪くないかもしれませんが、さすがに2020年時点では何とも使いどころがなさそうです(何か入力するならvimかemacsといったところでしょうか)。
さてfooter.txtファイルができたのでall.txtファイルの末尾に連結してみましょう。>>記号を使って以下のように指定します。
cat footer.txt >> all.txt
PowerShellの場合、catに複数ファイルを指定できなくても>記号と>>記号を利用すれば同じことができます。
ちなみにコマンド実行時の日付をfooter.txtファイルに保存するなら以下のようにすることもできます。(UNIX系)
date "+%Y/%m/%d" > footer.txt
PowerShellの場合は以下のようになります。
Get-Date -Format "yyyyMMdd" > footer.txt
単に日付をファイルの末尾に追加するだけなら以下のようにしても同じです。方法は色々あるので、状況に応じて使い分ければよいでしょう。
date "+%Y/%m/%d" >> all.txt
PowerShellの場合は以下のようになります。
Get-Date -Format "yyyyMMdd" > footer.txt
行番号を追加する
catには行番号を追加する機能があります。前回使ったPowerShellの以下のコードに番号を付けてみます。なお、このオプション指定はPowerShellではエラーになります。
2021..2025|%{
New-Item -ItemType Directory ~/Desktop/data/$_;
cd ~/Desktop/data/$_;
mkdir (1..12);
}
このコードをcode.txtという名前のファイルでデスクトップのsampleディレクトリに保存しておきます。
行番号をつけるにはcatに-nを付けます。プログラムを雑誌やWebに掲載する場合に役立つかもしれません。
行番号を付けたものを別ファイルとして保存することもできます。これまでも使ってきたリダイレクト記号の>を使って以下のようにコマンドを入力します。
cat -n code.txt > code2.txt
ファイルを作成する
ファイルを作成するためのコマンドはいくつかあります。その1つとしてtouchコマンドがあります。touchコマンドを使う前にデスクトップに新しくsample2という名前のディレクトリ(フォルダ)を作成しておきます。GUIで作成しても構いませんし、以下のようにコマンドを入力して作成してもかまいません。
sample2ディレクトリが作成できたら、カレントディレクトリをsample2にします。以下のようにcdコマンドを入力します。
cd ~/Desktop/sample2
中身のないファイルを作成するには以下のように入力します。つまり0バイトのファイルが作成されます。ファイル名の拡張子はとりあえずtxtにしてありますが、まあdatでもbinでも構いません。
touch test.txt
touchコマンドはダミーファイルだけが欲しい場合に使うことができます。前回のディレクトリ作成と同じように以下のようにすると連番ファイルが作成されます。何かコマンドをテストしたりする場合には便利です。
touch {0..9}.txt
PowerShellの場合はNew-Itemを使います。ItemTypeにfileを指定します。以下のようにするとtocuhコマンドと同様に0バイトのファイルが作成されます。
New-Item -ItemType file test.txt
連番ファイルの場合は以下のようになります。他にも色々書き方がありますが、そこらへんは前回のディレクトリ作成の回を参照してください。
0..9 | %{New-Item "$_.txt" -ItemType file}
touchの用途の1つとしてタイムスタンプ(更新日時)を変更するというのがあります。例えば手作業では面倒だけど、プログラムならすぐに終わってしまうような仕事を受けたとします。こういう場合は手作業で頑張ってやりますと見積もりを出して、その実プログラムで楽して終わらせます。が、納品するファイルのタイムスタンプからプログラムで簡単に作成したのがバレてしまう可能性があります。その時にtouchコマンドを利用してタイムスタンプを頑張ってギリギリまで仕事してましたとアピールします。(人は頑張ってくれた努力に対しては対価を支払う気になからです) touchコマンドでタイムスタンプを変更するには以下のようにします。まずは、MacのzshやbashおよびUbuntuなどUNIX系の場合です。
touch -t "202012312359" test.txt
PowerSehellの場合はSet-ItemPropertyを使って以下のように指定します。更新日でなく作成日を変更する場合はLastWriteTimeの文字をCreationTimeにすればOKです。
Set-ItemProperty test.txt -Name LastWriteTime -Value "2020/12/31 23:59"
複数のテキストファイルをまとめて変更する場合は以下のようにします。*はワイルドカードですが、これについてはまた別の機会に。
touch -t "202012312359" *.txt
PowerShellの場合は以下のようになります。bashやzsh同様にワイルドカード(*)を使えばOKです。
Set-ItemProperty *.txt -Name LastWriteTime -Value "2020/12/31 23:59"
ちなみに日付をファイル名にする場合は以下のようになります。UNIX系で動作します。
touch `date "+%Y%m%d"`.txt
時間だけのファイル名なら以下のようになります。
touch `date "+%H%M%S"`.txt
日付と時間を含むファイル名なら以下のようになります。
touch `date "+%Y%m%d-%H%M%S"`.txt
PowerShellの場合は以下のようになります。実際は2行ですが、1行にまとめて書いています。
$d=Get-Date -Format "yyyyMMdd";New-Item -ItemType file "$d.txt"
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。