ターミナルを使って、ファイルやディレクトリ操作で楽をする


Macのターミナル…いわゆる「黒い画面」。 慣れるまではなかなか手が出せませんが、実は、GUIでは手間ばかりかかってしょうがない単純作業を行うのに非常に適したスグレモノです。

しかし、かく言う自分もたまにしか使わないので、ちょっと変わったことをしようと思うと、都度都度ググっております。 そのため、使ってみて便利だったコマンドを、備忘録も兼ねてわりとシンプルな例でまとめてみました。

これを書くにあたってあちこちのサイトを参考にさせてもらってあらためて感じましたが、ただコピペするだけじゃなく、どういう意味を持ってそのコマンド、その書式になっているかを知ることが一番大事ですね。 どういうことがどんな風にできるかわかれば、「あ、これならターミナル使ったほうが早いな」と気づくこともできると思います。

ディレクトリの操作

目的のディレクトリに移動

「cd」コマンドでディレクトリを移動できますが、Macローカルの場合、日本語が混じったり階層が深かったり、意外にディレクトリ移動はしにくいものです。
が、ターミナルの場合、移動したいフォルダのアイコンをターミナルのウィンドウにドラッグすると、そこへのパスが自動で入力されます。
コマンドラインに「cd 」(最後にスペース)と打ち込んだあとにアイコンをドラッグすることで、Enterキー一つでディレクトリ移動ができます。

ディレクトリを一気に作成する

ディレクトリを一気に作成したい場合、一つ一つ「新規フォルダ」しなくても、mkdirコマンドで一気に作成できます。
スペースで区切って、作成したいディレクトリ名を列記します。
下記の例では、現在のディレクトリの中に、3つのディレクトリが一度に作成されます。

mkdir ディレクトリ名1 ディレクトリ名2 ディレクトリ名3

また、次のようにすると、現在のディレクトリの中に「ディレクトリ名1」が作成された後、その下に、{ }内のディレクトリが作成されます。

mkdir -p ディレクトリ名1/{ディレクトリ名2,ディレクトリ名3,ディレクトリ名4}

ファイルの操作

複数のディレクトリにファイルをコピー/削除する

一気にコピー

テンプレートファイルなど、ある一つのファイルを、複数のディレクトリに一気にコピーするコマンドです。

echo ディレクトリ名1 ディレクトリ名2 ディレクトリ名3 | xargs -n1 cp コピーしたいファイル
echo
引数の文字列や変数の中身をそのまま表示
|(日本語キーボードの場合、Shift+¥)
前のコマンドの結果を次のコマンドに渡す「パイプライン」
xargs
渡された内容を元に、設定したコマンドを実行
cp
ファイルをコピーする

この場合、echoで渡された、スペース区切りのディレクトリ名の一覧がxargsの処理の対象になります。
xargsの後ろにある「-n1」は、作成されるコマンドの引数を1つに制限するオプションです。
ディレクトリ名一つ一つに対し、「cp コピーしたいファイル」のコマンドが実行されます。

応用で、次のようなことも可能です。

ls -F | grep / | xargs -n1 cp ../../index.html

現在のディレクトリの中にあるサブディレクトリのそれぞれに、2つ上の階層にあるindex.htmlというファイルをコピーするコマンドです。

ls -F
lsはファイル、ディレクトリの一覧を出力するコマンド
-Fは、ファイル名ディレクトリ名だけを出力して、ディレクトリ名には/を付けてくれるオプション
grep
指定した文字列を含むものだけをフィルタリング
この場合は「/」を含む(ディレクトリ名)だけを次に渡す

先の例では直接コマンドラインに書いていたものを、動的に出す感じです。

一気に削除

ls -F | grep / | xargs -n1 -I% rm %index.html

現在のディレクトリのサブディレクトリそれぞれの中にあるindex.htmlを削除します。

-I%は、渡された内容(この場合はディレクトリ名それぞれ)で、後ろの実行したいコマンド中にある%を置き換えるというオプションです。
仮にディレクトリ名が「html/」だった場合、rm %index.htmlは、rm html/index.html というコマンドで実行されます。

複数のディレクトリにあるファイルを一気にリネームする

例えばCMSの場合、ダウンロードしたCMSのアーカイブの中のいろいろなディレクトリにhtaccess.txtというファイルがあり、これをインストールの際に、.htaccessにリネームしなければならないことがあります。
手動でやると意外に面倒ですが、これを一気に、作業もれなくやってしまうコマンドです。
CMSのディレクトリに移動した後に、以下のコマンドを実行します。

find . -name htaccess.txt | perl -pe s/htaccess.txt/" "/g | xargs -pt -n1 -I% mv %htaccess.txt %.htaccess
find . -name htaccess.txt
ファイルやディレクトリを検索するコマンド
「.」で検索対象をカレントディレクトリに、「-name htaccess.txt」でhtaccess.txtという名前のファイルを探すという条件を設定
perl -pe s/htaccess.txt/" "/g
perlをコマンドラインで実行
「-pe」のeでこの後に続くコマンドを実行(この場合正規表現)、pで結果を出力するオプション

正規表現はややこしいですが、ここでの例の場合、htaccess.txtという文字列を、" "(半角スペース)に置換するという動作を行っています。 (s/A/BでAをBに置換、/gで対象すべてを、という意味)

また、ここでのxargsに「-pt」というオプションをつけていますが、pでコマンド実行前にそのコマンドを表示、tでコマンドの実行の確認をしてくれるようになります(yで実行、nで拒否)。

このままだとファイル名を何度も書く必要があるので、次のように書くこともできそうです。

fn=htaccess; find . -name ${fn}.txt | perl -pe s/${fn}.txt/" "/g | xargs -pt -n1 -I% mv %${fn}.txt %.${fn};unset fn

fn=htaccessで、fnにファイル名を格納します(シェル変数)。以降、${fn}(または$fn)で中を参照できるようになります。
最後のunset fnで、念のためfnを削除します。

今回の例では起こりませんが、対象のファイル名を正規表現のワイルドカードを使って絞り込んだ場合、ファイル名にスペースが入る可能性があります。
上記のような書き方だと、xargsはスペースを区切りとして実行対象を決めてしまうため、ファイル名の途中で分割されてしまい、うまく動作しません。
これを回避するために、次のような書き方があるそうです。

find . -name htaccess.txt -print0 | perl -pe s/htaccess.txt/\\0/g | xargs -pt -0 -I% mv %htaccess.txt %.htaccess

findの「-print0」とxargsの「-0」で、それぞれ区切りを「\0」に設定します。あわせて置換する文字も「\0」にしています(\2つ並ぶのは、いわゆるエスケープ)。
これであれば、ファイル名中の空白も問題なく処理されるようです。


このページをみんなにシェアする

お問い合わせ

ファイルサイズが大きすぎます。