今回はファイルの移動、リネームです。コマンドに慣れていない人はラズベリーパイ上または仮想環境上で実行した方がよいでしょう。ファイル操作を行うコマンドに慣れたら実機、本番環境で実行してください。
あと、注意事項としてファイルの移動やリネームが可能なのは権限がある場合だけです。つまり自分のファイルではなく他人のファイルは権限がない限り操作できません。以後説明するコマンドでうまく処理されない場合は自分にファイル操作の権限があるかどうか確認してみてください。UNIX系およびMac版のPowerShellではls -lとすると権限(パーミッション)、所有者・グループ、日付、ファイル名の情報が一覧で表示されます。Windows版のPowerShellでは、そのままlsと入力するかGet-ChildItemと入力すると詳細情報が表示されます。
○ファイルの移動
まずはファイルの移動からです。ファイルを移動させるコマンドはmvです。これは移動を意味するmoveの単語を省略したものです。大昔はとにかくコンピュータで使えるメモリ、リソースが大変少なかったので、コマンド名に限らず、とにかく省略されています。最近では使えるメモリなどが多いのでコマンドのオプションは省略せずに書けたりします。ちなみにコマンド名を省略する場合は英語の母音を削除するのがほとんどです。
それはよしとして本題に戻ります。まず、わかりやすくするためにデスクトップ上にディレクトリを二つ作成します。testとdataです。以下のようにコマンドを入力すると作成できます。コマンドではなくGUIで作成しても構いません。
mkdir ~/Desktop/test
mkdir ~/Desktop/data
次に移動させるファイルをデスクトップに1つ作成します。これまでのようにechoコマンドとリダイレクトで作成しても構いません。テキストエディタで作成しても、どこからから画像ファイルを1つデスクトップにコピーして用意しても構いません。すでにデスクトップにあるファイルを移動させたいなら、それを使っても構いません。その場合は移動させるファイル名を適宜読み替えてコマンドを入力してください。
とりあえず手軽なところでtouchコマンドで1.txtという名前のファイルを作成します。以下のように入力します。
touch ~/Desktop/1.txt
PowerShellの場合はNew-Itemを使ってファイルを作成します。なお、Mac版のPowerShellでは上記のtouchコマンドでもファイルを作成できます。
New-Item -type file ~/Desktop/1.txt
それでは、この1.txtファイルをtestディレクトリに移動させます。以下のようにコマンドを入力します。
mv ~/Desktop/1.txt ~/Desktop/test/
PowerShellでも同じコマンドで動作します。これはmvがMove-Itemのエイリアスとして定義されているからです。以下のように入力しても同じ結果になります。
Move-Item ~/Desktop/1.txt ~/Desktop/test/
mvの後に移動させるファイル名を指定します。その後に半角空白を入れます。その後に移動先のディレクトリ名を指定します。ちなみにTabキーを押してパスが補完される際、ディレクトリなら自動的に/が末尾につきます。これはシェルの補完機能です(使用環境によっては補完機能が動作しない場合もあります)。
コマンドを実行したら、本当にファイルが移動したか確認しましょう。GUIならデスクトップから1.txtファイルが消えているはずです。そしてtestディレクトリを開けば移動させたファイルが確認できます。なければ失敗してますので、コマンドで指定したファイル名とディレクトリ名を確認してください。
●複数ファイルやディレクトリを一気に移動
○複数ファイルの移動
それでは次に複数のファイルを移動させてみましょう。と、その前にtestディレクトリに移動させた1.txtファイルは削除してください。削除するコマンドは次回説明しますが、以下のように入力すると先ほど移動させた1.txtファイルが削除されます。
rm -f ~/Desktop/test/1.txt
PowerShellでも上記のコマンドで動作します(rm -Forceにします)。rmがRemove-Itemのエイリアスとして定義されているからです。ですので、以下のように入力しても1.txtファイルを削除することができます。
Remove-Item ~/Desktop/test/1.txt
なお、このようにrmコマンドを入力して削除されたファイルはゴミ箱に入る事なく、バッサリと削除されてしまいます。気をつけましょう。そんなコマンドを使ってまで削除したいくない(失敗したくない)のであれば、GUIでファイルをゴミ箱に入れてください。
それでは、今度はtestディレクトリに連番ファイルを作成し、そのファイルをdataディレクトリに移動させます。
とりあえず入力するディレクトリパスを長々と入力するのは面倒なので、cdコマンドでtestディレクトリに移動します。以下のように入力するとカレントディレクトリが~/Desktop/testになります。カレントディレクトリのパスを調べるにはpwdと入力すればOKです。
cd ~/Desktop/test
次に7個の空ファイルを作成します。bash,zshなら以下のようにコマンドを入力すると7個のファイルが作成されます。
touch {1..7}.txt
PowerShellの場合は以下のようにコマンドを入力します。
1..7 | %{New-Item "$_.txt" -ItemType file}
それでは、この7個のファイルをdataディレクトリに移動させます。mvコマンドは移動させるファイルを複数指定できます。以下のようにすると1.txt, 2.txt, 3.txtファイルがdataディレクトリに移動します。
mv 1.txt 2.txt 3.txt ~/Desktp/data/
mvコマンドで2個以上のパラメーターが指定された場合、最後のパラメーターが移動先になります。最後のパラメーターより前が移動対象のファイル・ディレクトリになります。
それでは次に特定の拡張子を持つファイルをまとめてdataディレクトリに移動します。とりあえず先ほど移動させた1.txt,2.txt,3.txtを元のtestディレクトリに戻しておきます。mvコマンドを使ってtestディレクトリに移動させてください。どのようなコマンドを入力すれば良いかは考えてみてください。ちょっとした練習です。やっぱりわからない、という場合はGUIで1.txt,2.txt,3.txtを元のtestディレクトリに戻しても構いません。
さて、複数のファイルをまとめて移動させるには以下のようにワイルドカードを指定します。(カレントディレクトリは~/Desktop/testです)
mv *.txt ~/Desktop/data/
複数の異なる拡張子を持つファイルを移動させることもできます。とりあえずtestディレクトリ内にある拡張子がjpgおよびjpegのファイルをdataディレクトリに移動させます。jpg、jpegの拡張子を持つファイルは以下のようにtouchコマンド等で作成しておきます。ついでにtxtの拡張子のファイルも作成します。もちろん、用意できるなら以下のコマンドを入力する必要はありません。
touch {1..7}.{txt,jpg,jpeg}
jpgとjpegの拡張子を持つファイルをdataディレクトリに移動させるには{}内に,で区切って拡張子を指定します。
mv *.{jpg,jpeg} ~/Desktop/data/
もう少し条件を付けたファイルの移動もできます。拡張子がjpgまたはjpegで、さらにファイル名が1〜3の範囲のものだけをdataディレクトリに移動させるには以下のようになります。
mv [1-3].{jpg,jpeg} ~/Desktop/data/
PowerShellだと以下のようになります。
Move-Item [1-3].jpg,[1-3].jpeg ~/Desktop/data/
○ディレクトリを移動
ファイルの移動だけでなくディレクトリの移動もできます。とりあえず、testディレクトリ内にsampleという名前のディレクトリを作成しておきます。以下のコマンドを入力するかGUIでディレクトリを作成します。
mkdir ~/Desktop/test/sample
ディレクトリの移動もファイルの移動と同様にmvコマンドを使います。指定方法はファイルの時と同じです。以下のように指定するとデスクトップ上にあるtestディレクトリ内にあるsampleディレクトリがdataに移動します。
mv ~/Desktop/test/sample ~/Desktop/data/
●ファイルやフォルダをリネームする
○ファイル名・ディレクトリ名の変更(リネーム)
次にファイル名の変更についてです。mvコマンドはファイル・ディレクトリの移動だけでなくファイル名の変更という機能もあります。最初にUNIXコマンドを学習し始めた時にファイル名の変更はどうするのかわかりませんでした。PC-9801などで使われていたMS-DOSにはRENというファイル名を変更するコマンドがあり、UNIXにも当然あるだろうと思って探したらファイルの移動を行うmvを使う、とあり専用コマンドがないの?と思ってしまいました。でもまあ、ファイル名の変更ができれば何でもOK、気にしないということにしました。まあ、それはよしとして本題に戻りましょう。
mvコマンドでファイル名を変更する場合はmvの後に変更前のファイル名、最後のパラメーターに変更後のファイル名を指定します。
とりあえず練習としてデスクトップ上にあるtestフォルダに移動します(すでに作成済みのはずですが、もし消してしまったら作成してください)。これでカレントディレクトリがtestになります。
cd ~/Desktop/test
1.txtというファイルを作成します。bash,zshでは以下のように入力します。
touch 1.txt
PowerShellでは以下のように入力します。
New-Item -type file 1.txt
それでは、この1.txtのファイル名を2.txtに変更してみましょう。以下のように入力するとファイル名が変更されます。bash,zsh,PowerShellでも動作します。
mv 1.txt 2.txt
ここで、すでに2.txtファイルがある場合、2.txtファイルがなくなり、代わりに1.txtファイルが2.txtとなります。つまり上書きされることになります。おまけにオプションを指定していないと警告もなしにバッサリと上書きされます。
さすがにそれは怖い(困る)という場合はiまたはnオプションを指定しておくとよいでしょう(Windows版PowerShellは除く)。iオプションを指定すると確認のメッセージが表示されるようになります。上書きする場合はyキーを押してからリターンキーを押します。上書きしたくない場合はnキーを押してからリターンキーを押します。
mv -i 1.txt 2.txt
Windows版のPowerShellではiオプションではなくConfirmオプションを指定すると確認のメッセージが表示されるようになります。
Move-Item -Confirm 1.txt 2.txt
常に上書きしない、と言うのであればnオプションを指定しておけばOKです(Windows版PowerShellを除く)。ただ、ファイル名が変更できなかった場合でも何もエラーメッセージ等は出力されません。逆に強制的に上書きするならfオプションを指定します。複数のファイルを移動させたりする場合には、このようなオプションを指定しておかないと期待通りの動作にならないことがあります。
また、自動処理を行う場合や環境による動作の違いも考慮するなら、このようなオプションは明示しておいた方が安全です。なお、mvコマンドのオプションは環境によって使えるものと使えないものがあります。Linuxだと結構多くのオプションが使えますが、Macの場合はあまりオプションがありません。
mv -n 1.txt 2.txt
●スクリプトでの活用術
○拡張子で自動振り分け(bash,zsh)
mvコマンドを利用して現在のディレクトリにある画像を種類別に分類してそれぞれのディレクトリに格納するようにしてみましょう。とりあえずPNG,JPEG,GIF形式の3種類とします。このうちJPEG画像は拡張子がjpg,jpegの2種類あるものとします。これらの画像ファイルが格納されているのはデスクトップ上にあるtestディレクトリとします。もちろん、他のディレクトリでも構いませんが、その場合は適宜読み替えてください。
まずは分類する画像ファイルを用意しておきます。が、用意するのは面倒だという人は以下のようにコマンドを入力すればサンプルファイルが作成されます。ただし、以下のコマンドはbash,zshのみです。PowerShellでは動きません。
touch {1..3}.{png,gif,jpg,jpeg}
次に画像を格納するディレクトリを作成しておきます。このディレクトリはデスクトップ上にあるtestディレクトリ内に作成します。
cd ~/Desktop/test
mkdir jpg
mkdir png
mkdir gif
あとはmvコマンドで拡張子ごとに、それぞれのディレクトリに移動させます。
mv *.{jpg,jpeg} jpg/
mv *.gif gif/
mv *.png png/
ちなみに毎回ファイルを分類するたびにこれらのコマンドを入力するのは面倒だという人がいるかもしれません。そのような場合はシェルスクリプトとして作成しておけば便利に使えます。シェルスクリプトに関しては別の機会に説明します。とりあえず、シェルスクリプトを作成し実行する部分までざっと説明します。なお、これはbashをベースにしています。
まず、カレントディレクトリはデスクトップ上にあるtestフォルダにします。もちろん、状況に応じて他のディレクトリでも構いません。cdコマンドでtestディレクトリに移動します。
cd ~/Desktop/test
次に以下のようにコマンドを入力します。
vi classify.sh
(vi/vim)というテキストエディタが起動します。iキーを押して以下のコマンド群を入力します。あらかじめコピーしておいてペーストした方が間違いはないでしょう。
#!/bin/bash
cd ~/Desktop/test
mkdir jpg
mkdir png
mkdir gif
mv *.{jpg,jpeg} jpg/
mv *.gif gif/
mv *.png png/
入力が終わったらescキーを押します。次に:wqの順番にキーを押してリターンキーを押します。
すると元の画面に戻ります。作成したシェルスクリプトに実行権限を追加します。以下のようにコマンドを入力します。
chmod u+x classify.sh
これでできあがりです。実行する場合は以下のように入力します。
./classify.sh
実行すると拡張子に応じてファイルが分類されます。なお、すでにディレクトリがある場合や移動するファイルがない場合はエラーメッセージが表示されます。
エラーメッセージが気になる、そんなの表示しなくてもいいという人は以下のようにコマンドを入力してください。
./classify.sh 2>/dev/null
まあ、エラーメッセージは破棄せずに保存した方がいいような気もしますが。その場合はリダイレクト(>,>>)を使って適当にテキストファイルとして保存すればよいでしょう。
こういう分類する処理はタイマー(UNIXならcron)を使うと便利です。ディレクトリに画像を入れるだけで自動的に分類してくれるからです。が、本当に分類すればうまく整理整頓できるのか?と言うと、そこはあまりうまくいかないこともあります。というか、思ったほどうまくいかないの実情ではないでしょうか。そんな時はfindや全文検索することで目的のファイルを見つける方法があります。が、それはまた別の機会に。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。