Linux, Bash: fd コマンドでファイルやディレクトリーを探す

bash_eyecatch 冒険

~ fd コマンドの基本とそれを利用したシエル・ファンクション~

おまけ:今日のショート・カット

$ clear

でアウト・プットを一掃することが出来るが、

Ctrl + l (エル)

のショートカットでも同じことが出来る。

記事の難易度:初心者向け(コマンド・ラインの学習を始めた方など)
執筆者のキャプテン・クッキーはまだ初心者なので、このポストまでの記事は今の所、入門レベル 又は 初心者向け の二つのレベルの内のどちらかになっています。

記事内容を試行した環境:ubuntu 20.04

#本題に入る前に

fd コマンドを利用するには、自分の ubuntu 20.04 環境の場合デフォルトでは利用できないらしく、インストール作業が最初に必要だった。

$ sudo apt-get install fd-find

上記のコマンドでインストールできた。

#本文

まず注意したい事は実際にコマンドを実行する時にはインストールの時と違い、ハイフンは必要ないという事だ。こういう事はコマンド・ラインでのオペレーションの時には割とある。疲れている時などは一文字違いなどのミスをすることもあるかもしれない。

最初にコマンド単体で実行するとどうなるか。

$ fdfind

上記のようにオプションもアーギュメントも付けない場合は ls コマンドのような仕事をしてくれる。違う点はサブ・ディレクトリまで対象にして実施してくれる所だ。ターゲットのディレクトリを明示しない場合、カレント・ディレクトリを対象にする点は ls コマンドと同じだ。

###

$ fdfind -e jpg

ファイル・タイプを指定してサーチしたい場合はこのように -e オプションに続いて、エクステンションを入力すれば良い。

###

$ fdfind KEYWORD STARTING_DIRECTORY

キーワードとサーチの起点となるディレクトリーを指定する場合は上記のようなシンタックスになる。

例としてファイル・システム全体から hinano というキーワードを含むものを探す場合、次のようなコマンド・ラインで実施できる。

$ fdfind hinano /

###

$ fdfind -e EXTENSION KEYWORD STARTING_DIRECTORY

上記のシンタックスでエクステンションの指定と組み合わせてサーチができる。

例えばファイル・タイプは jpg で hinano を含むものをファイル・システム全体からサーチする場合は次のようなコマンド・ラインで実行できる。

$ fdfind -e jpg hinano /

#####

-t オプションを使えばサーチ対象をファイルなのかディレクトリなのか、そうした事が指定できる。-t に続けてもう一文字、目的を指定するためのアルファベットを続けるという形で使用する。下記にその例を記す。

-tf: ファイルを対象にする。

-td: ディレクトリを対象にする。

-tl: シンボリック・リンクを対象にする。

-tx: エクセキュータブル・ファイルを対象にする。

### Executable Files

$ chmod 755 の様なコマンドで実行が許可されているファイルなどを指すと認識しているが正確には把握出来ていない。ちなみに、スクリプトなどを自分で作った場合もこのコマンドでファイルの実行が許可されている状態にした上でそれを行う。

###

-te: エンプティ・ファイル対象にする。

### Empty Files

現状自分はどういうものか把握できていない。

###

$ fdfind -td KEYWORD STARTING_DIRECTORY

上記のようなシンタックスでサーチ対象を絞り、併せてキーワードとサーチの起点となるディレクトリも指定出来る。

例えばファイル・システム全体から hinatazaka46 という名前を含むディレクトリをサーチするなら次のようなコマンド・ラインになる。

$ fdfind -td hatazaka46 /

###

コマンドは連結して使うとより便利になる。ここでは -x というオプションを使って mv コマンドにサーチ結果を渡し、ファイル名に任意の文字列を付け足すことが出来るコマンド・ラインを参考として紹介してみる。

$ fdfind mao . -x mv {} {}_fav

このコマンド・ラインが意味する所は次の通りだ。

まず fdfind コマンドが mao という文字を含むものを . が意味する所のカレント・ディレクトリで一つずつ探していく。その結果を mv コマンドに一つずつ渡して処理を実行してもらうのだが、{}の部分がその見つかったファイル・パスの入れ物、器になる。

例えば見つかったものが mao_smile というファイルだった場合、

mv mao_smile mao_smile_fav

というコマンド・ラインが実行される事になる。一つ目でも二つ目でも {} の部分には同じ文字列が入る。

結果として mao_smile が mao_smile_fav という名前に変更される。

ファイルが写真の場合は jpg などのエクステンションが付いてると思うので、この参考コマンド・ラインだと目的が上手く果たせないが、下記の様なシエル・ファンクションを作成して実行すればそれは可能となる。

###

fdinsert() {
for filename in $(fdfind $1 $2); do
mv “$filename” “${filename%$4}$3$4”
done
}

###

例えばこのシエル・ファンクションを自分のホーム・ディレクトリにある .bashrc に書き足した上で一旦ターミナルを閉じて開き直し(これは ubuntu の場合でディストリビューションによって挙動は異なるらしい。また、書き足す先のファイルが .bashrc で無い場合もある)

$ fdinsert hinano hinatazaka46 _fav .jpg

というコマンド・ラインを実行してみたとする。

すると、まず fdfind コマンドがカレント・ディレクトリにある hinatazaka46 というサブ・ディレクトリから hinano という名前を含むものを探してくれる。

もし hinano_live.jpg というファイルが見つかったとするならば、それが mv コマンドに受け渡されて、.jpg の前に _fav という文字列が加えられて、

hinano_live_fav.jpg

というファイル名に変更してくれる。

ただし、もし hinano.png というファイルが存在していた場合、この書き方のシエル・ファンクションでは hinano.png_fav.jpg にリネームされるのでこれも少し都合が悪い。

###

そこで少し変更を加えて次のようにすれば今くいくように思う。

fdinsert_v2() {
for filename in $(fdfind -e $1 $2 $3); do
mv “$filename” “${filename%.$1}$4.$1”
done
}

この場合、実施の際に打ち込むコマンド・ラインは次の様な感じになる。

$ fdinsert_v2 jpg hinano hinatazaka46 _fav

これでカレント・ディレクトリにある hinatazaka46 というサブ・ディレクトリからファイルタイプを jpg に絞って hinano を含むファイルをサーチし、見つかったファイルに対してエクステンションの前に _fav という文字列を加える作業が実施される。

もしも hinano_smile.jpg というファイルが見つかったならば、
hinano_smile_fav.jpg という名前に首尾よく変更が実施出来ることになる。
このシエル・ファンクションの書き方なら png ファイルに影響を与える事もない。

### ### ###

注意!: このサイトや他のあらゆるサイトに掲載されているコマンド・ラインやシエル・スクリプトを、中身を確認せずにコピーして実行するような事は避けてください。実行してみる場合は必ず man や info –help などでどういう結果が起きるのかを確認してください。不測の事態は油断した時に突如起こります。

自分も全く理解できないような、内容のコマンド・ラインをコピーして実行するような事はありません。ドキュメントやアドバイスの例文も不明な点は必ず man などで調べてから実施するようにしています。よって自分が受け手として注目する際のポイントは、ちょっとした書き方の違いでこういう事が実現出来る、といった点になります。自分のポストもそういう観点で見ていただければと思っています。

また、シエル・ファンクションやシエル・スクリプトを作成して実行する場合は、よくよく自分のカレント・ディレクトリがどこなのか、あるいはコマンド・ラインの実行先をどこ指定しているのか、もしくはどこに設定されているのかといったことを念を入れて確認してください。自分も意図せず、大量のアウトプットが表示され焦るという事がまま有ります。

ファイルを消去するようなコマンドを含むものなら更なる注意が必要です。ワイルドカードとの合わせ技で大変な事態を招いてしまったというエピソードを目にする事があります。

#本文終わり

### おまけコーナー

ファイルの名前を付け足す機能の実現は割と簡単だが、終わりの数文字を変えたりするのは少し複雑だったりすることがよくあるように思います。自分と同じビギナー・ユーザーの皆さん、試行錯誤を楽しみながらシエルやスクリプトを習得して行きましょう。

YouTube でも最近「ゼロからの…シエル・マスター」といった感じのシリーズを始めました。英語の時も日本語の時もあります。ブログの方はテック系のポストという事もあり、硬派な筆致になっていますが動画の方はリラックスした感じなのでよかったら遊びに来てください。エレキギターや弾き語りで 日向坂46 や ひらがな時代の楽曲を取り上げたものや、ハード・ロックのギターソロをレクチャーする動画もよくアップしています。

最近は Boothole に対するセキュリティ・パッチの適用で起動に不具合が出るといった話題が大きく取り上げられており、なんだかアップグレードを実行するのが怖い感じもしたのですが、少し遅れて実施した結果、問題なく自分の環境では ubuntu 20.04 は動作出来ています。Boothole の実害より、パッチによる問題の方が大きいという記事も見かけます。

相対的にセキュアーであると良く言われますが、そうした問題には気をつけていたいものです。

世界の人達のおかげで盛り上がっている Linux やオープン・ソースの事がもっと広まればいいのになあ〜、と思いながら日々学習に励んでいます。

###

ご指摘などがあれば、
twitterアカウント: @3C_CPT_COOKIE
までお願いします。
(フォロー関係にない場合は気付けません。)

タイトルとURLをコピーしました