【Mac】ターミナルをファイラーとして使う

2020年1月31日

世の中にはファインダーにあまり触らず、ターミナルをファイラーのように使用するひと達がいる。なぜそんな苦行めいたことを? と最初は思うが、じつはただの横着が導いた結果だったりするのかもしれない。
 つまり、ターミナルを使った操作のほうがファインダーの操作より、楽なこともあるということだ。

深い階層にファイルを移動する

例えばダウンロードフォルダにある怪しげな画像ファイルを、どこかのフォルダの深い場所に隠したい場合である。そのフォルダには、いままでネットで採集しつづけてきた怪しげな画像が大量に収納されている。

ファインダーでそれをやるなら、例えばピクチャフォルダ > ネットの拾い物 > 怪しげフォルダ、などと階層を毎回たどらなくてはならない。
 ターミナルでやるならもっと大変で、~/Pictures/ネットの拾い物/怪しげフォルダなどと日本語混じりのパスを打ちこまなくてはならない。
 ターミナルのほうが面倒に思える。

ところが、一連の操作を .zshrc とかに記述しておくと、途端に面倒臭さの逆転が起こる。

mvaya(){
    mv "$@" ~/Pictures/ネットの拾い物/怪しげフォルダ
}

例えばこんな関数だ。
 ついでにダウンロードフォルダへの移動もダルい。エイリアスに登録しておけば簡単だ。

alias dl="cd ~/Downloads"

こんな感じになると思う。
 source ~/.zshrcで .zshrc を再読みこみする。
 あとはもうdlだけでダウンロードフォルダへ怠惰に移動し、mvayaまで入力したらダラダラとタブキーを連打して候補を探し、実行するだけである。catalina から採用された zsh はタブキーでファイルの候補を表示してくれるのである。

ファイルを確認する

しかし、移動しようとしている画像ファイルは本当に怪しい画像なのだろうか。

ターミナルによるファイル操作には弱点がある。画像ファイルの中身が確認できないのだ。
 ファインダーはこの点、視認性に優れている。
 アイコン表示もできるし QuickLook もある。

ターミナルでも QuickLook は使えるらしい。よく紹介されているエイリアスが、

alias ql='qlmanage -p "$@" >& /dev/null'

というもの。ql ファイルを実行すると確かに QuickLook で中身を確認できる。
 筆者はプレビュー.app を使っている。

alias prev='open -a Preview.app'

しかし、プレビュー.app の場合、大量にある画像から、ファイル名のわからない一枚の画像を探すのは大変である。一枚一枚画像を開いていくのはあまりにダルい。
 筆者は「絵箱」という、最近 64bit 化された優れたアプリを使わせていただいている。

🔗 – Nekobooks

alias ebako="open -a 絵箱5.app"

ebako ディレクトリで、ディレクトリ内の画像を一覧にしてくれて便利だ。
 ここで目的の画像を探し、ターミナルにドロップしたりしている。

ようするに、QuickLook できないようなファイルは、そのファイルを開くアプリをopen -aすればいい、という話である。

ダルすぎ、いっぺんにファイルを操作したい

ファイルをひとつひとつ操作するなんてダルすぎる。
 同じ拡張子のファイルをいっぺんに操作したい。
 と、怠け者のわれわれは、やがて考えはじめる。

そういう場合はfindコマンドが便利だ。
 ダウンロードフォルダにある、なんか変な rar ファイルをぜんぶ解凍したいと考えたとする。

find ~/Downloads/ -maxdepth 1 -name \*.rar -exec unar {} \;

find コマンドはファイル、ディレクトリを検索してくれるコマンドである。
 基本はfind 検索する場所 -name 検索語という感じ。検索語は正確なファイル名を渡すか、ワイルドカード「 * 」を使用する。「 * 」はバックスラッシュでエスケープする。
 -maxdepth 1はカレントディレクトリのみを検索するためのオプションだ。find はサブディレクトリの中まで隈なく検索するので、扱いを間違えるととんでもない場所のファイルまで操作の対象にしてしまいかねない。
 -exec以下は、見つけたファイルをどうするか、という指示だ。
 unar は rar ファイル扱うコマンドである。Homebrew でインストールできる。
unar rarファイルで rar ファイルの解凍ということになる。
 検索に引っかかったファイルは{}の中に代入される。-exec ではじめた指示はバックスラッシュでエスケープしたセミコロン「 ; 」で終了させる。

もっと簡単なやり方もある。for 文を使うのだ。

for f (*.rar) unar $f

🔗 zshのfor文は強かった – Qiita

上記の記事で勉強させていただきました。
 こういったコマンドも、頻繁に使うようならエイリアスにしておけば便利だろう。

もっと簡単かもしれないやり方もある。

% ls
img001.jpg
img002.png
img003.png

こういうファイルがあるディレクトリがあったとして、これを全部、選択してどこかに移動したいとする。zsh ならmv imgまで打ちこんでタブキーを押せば、候補としてファイルが次々と入れ替わる。
 実はここにワイルドカード「 * 」を使用できるのだ。
 mv img*まで打ちこんでタブキーを押すと、

mv img001.jpg img002.png img003.png

と、いっぺんに候補を選んでくれるのである。
 mv img*.pngとやると、

mv img002.png img003.png

という具合。とても楽だ。

ファイルの削除

rm コマンドを使えば、ファイルを削除できる。しかし、rm コマンドは削っとばかりにファイルを消去してしまう。元に戻せない。ばんばん使っている猛者もいるらしいのだが、筆者は怖いのでなるべく使いたくない。
 その代わりに使うのがmv 削除するファイル ~/.Trashだ。
「削除するファイル」となっているが、ディレクトリを指定してもイケる。
 .Trash はゴミ箱のことで、隠しフォルダとしてホームディレクトリにある。

ただ、削除したいフォルダと同じ名前のフォルダが、すでにゴミ箱に入っている場合、うまく mv が出来ないことがある。筆者は以下のような関数にして .zshrc に記述している。

trash(){
	mv -n "$@" ~/.Trash >& /dev/null
	if test -e "$@"; then
		mv "$@" ~/.Trash/"$@"`date +%s`
	fi
}

mv Trash が失敗したら、リネームしてゴミ箱に移動しましょう、というものだ。たぶん、もっとうまいやり方があると思うのだが、今のところこれでだいたいは削除できている。

その他、楽しいところと限界

筆者も初心者なので偉そうなこといえないが、最初はよく失敗するので、本当にちゃんとファイルが移動できてるのか、などをよく確認したほうがいい。

また、ウェブサイトなどでコピーした文字列をターミナルにペーストすると、エスケープが必要な文字なんかがあって案外めんどう臭い。そういう場合はクオート「 ‘ 」で囲んでやるのが早い。

rename\ file\ name.jpg #みたいにするより、
'rename file name.jpg' #のほうが楽

zsh にはecho $f:qという変数展開もある。
 変数f の文字列をエスケープして返してくれるというもので、これを利用する手もあるだろう。

% f='/Users/username/Desktop/kira*kira name.png'
% echo $f:q
/Users/username/Desktop/kira\*kira\ name.png

ターミナルをファイラーとして使うのは、やってみると楽しい。
 ファイルを整理するのは、ファインダーでやれば単なる作業だ。ターミナルでやると妙に新鮮な挑戦となる。どう書けば実現できるか、どう設定すればより楽になるか、というクイズを楽しんでいる気分になる。
 また、やりようによってはいくらでも楽できそうなんである。エイリアスや関数だけでなくシェルスクリプトなども併用していけば、いくらでも限度なく、省力化が進むのではないか。場合によっては crontab などで定期的に実行させれば、もうターミナルを触る必要すらなくなるかもしれない。
 ファイラーとしてのターミナルは、Mac のカスタマイズの未踏のフロンティアになり得ると思う。

ただ、どうしてもファインダーで操作したほうが早い場合というのは必ずある。
 そういった場合は余計なこと考えずにカーソルで操作したほうがいいだろう。そのへん、見極めないと本末転倒になってしまいそうだ。