読者です 読者をやめる 読者になる 読者になる

室村日記

日々、試行錯誤したことを備忘録的にまとめていきます

ファイルを一括で検索して移動

1.はじめに

 ダウンロードしてきたフリーペーパーがPDFなのはいいんだけど,各章ごとに別フォルダに分割されちゃっていました.
f:id:muromura:20170426013039p:plain
 この中に1つずつバラバラに各章のPDFが入っている感じです.

 印刷したり読んだりするのに,いちいちフォルダを開いたり閉じたりして一箇所にまとめなくちゃいけないのが面倒だなーと思っていたところ,むかしbashでそういうファイル管理を触ったことがあるのを思い出したのでメモ.

*ちなみにMacならディレクトリだろ?とかbashLinux?とかよくわかんないのでスルー


2.相対パス

 相対パスの書き方って言語ごとに微妙に違うようですね.困りますね.
 とりあえず,bash書くときは ../ で親ディレクトリが取れます.
 さらに遡りたいときは ../../ のように続けていけば大丈夫そうです.


3.mv

mv [現在のpath] [移動したいpath]

ディレクトリやファイルが移動できます.このときに例えば

mv [現在のpath] ~/hoge/piyo.pdf

とすれば,hogeというディレクトリの下のpiyo.pdfと名前を変更しつつ保存できるし,

mv [現在のpath] ~/hoge/

とすれば,hogeというディレクトリの下に名前はそのままで保存してくれます.

基本的にbashのmv(移動)やcp(コピー)は,移動先に指定された名前のディレクトリが存在すればそこに,なければ勝手に作ってそこに移動してくれるようです.


4.正規表現

~/hoge/*

のように * を使うと,hogeディレクトリにある全てのファイル,ディレクトリのことを指してくれます.これはちなみに,

~/hoge/*.pdf

のように部分指定をかけることも可能です.

5.スクリプトbashとして動かす

 vimでもsublimeでもatomでもいいのですが,sample.shのように.shという拡張子のファイルを作ります.拡張子もべつに何でもいいのですが,シェルスクリプトであるということを表すために.shを用いるのが普通です.bashというのはシェルスクリプトの中の一つです.

 中身は以下のようにします.

#!/bin/sh

[ここに命令を書く]

 スクリプトが完成したら,ターミナルに

bash [.shファイルのパス]

 と打ち込むと実行できます.
 例えばカレントディレクトリにsample.shがあれば以下です.

bash sample.sh

6.サンプルスクリプト

ということで,以上全ての知識を生かして今回使ったスクリプトが下です.

#!/bin/sh

pdfs="../paper/*/*"
for pdf in $pdfs; do
    echo "Moving: " $pdf
    mv $pdf ../pdf/
done

ここでは,paperというディレクトリの下に
f:id:muromura:20170426013039p:plain
このようにディレクトリが並んでいて,その中にさらにpdfファイルが入っている状態から,paperのとなりのpdfというディレクトリに,一括でpdfファイルを移動する操作を行いました.

ちなみにbashでは,変数は頭に$をつけないと呼び出せません.
echoは標準出力してくれる関数です.他の言語のprintのようなものですかね.


5.まとめ

何を簡単なことをだらだら書いてんねんという話ですが,こういう簡単なことも,やらないと半年ぐらいですぐに忘れるのでメモしておきました.
初心者はありとあらゆるところにつまづきます.

それでは.