【Linux】20分後には「find」コマンドが使いこなせるようになるハンズオン練習
Hands-on practice where you will be able to use the Linux find command after 20 minutes.
Linuxのfindを使いこなせていますか?練習問題があると、ハンズオンがあるといいですよね。作りました。これを機にLinuxのfindコマンドをしっかり覚えて日常でささっと検索できるようにしましょう。Linuxのfindコマンドはフロントエンドエンジニアでもよく使います。
例えば画像を圧縮したり設定ファイルに記述したり..
では早速始めましょう
こちらはfind
コマンドが使えるようになるハンズオンですスターをお願いします
findはファイルやディレクトリを検索するコマンド
どこにあるかわからなくなってしまった時に使う
前提
- Mac(Windowsの方は置き換えてください)
- コマンドがある程度使える方。
下準備と確認
-
iTerm.app(or ターミナル.app)を立ち上げてください。vscodeのTERMINALでもいいです
-
testfindというディレクトリを作り、その中にindex.htmlを作ります。
それをコマンドで検索してみます
1.ディレクトリを作ります
mkdir testfind
2.作ったディレクトリに移動します
cd testfind
3. index.htmlを作り文字を書き込みます
echo "test" > index.html
4. 現在のディレクトリ内容を確認
ls
index.html
と出力される
5. 先ほど作ったindex.htmlを見ます
cat index.html
test
という内容が出力される
6. 一つ上に移動します
cd ../
find
1. findを使う
findの構文
find testfind
testfind
testfind/index.html
ディレクトリと下のファイルがfindされる
2. -name
(name判別式)で特定の拡張子を持ったものを探す
find testfind -name \*.html
testfind
ディレクトリの中にある拡張子がhtml
のものだけ見つけてtestfind/index.html
と出力される。
※\
は*
をエスケープさせるものです
3. Downloadsディレクトリ内で練習
Downloads
の中を使います
Dowonloadsの中を見るには
ls ~/Downloads
です
その中で任意の拡張子を検索してみましょう
例えば、
その中のpdf
だけを抽出したい場合
find ~/Downloads -name \*pdf
or
find $HOME/Downloads -name \*pdf
とか
多すぎて検索が止まらない場合
ctr + c
で止めます
結果が出てきたかと思います
このように拡張子を指定して見つけ出す事ができます。
また絶対パスを使うとカレント(現在のコマンド位置。pwd
で出てくる場所)がどこにあっても実行できます
-typeで指定する
-type f
でファイルを検索する
現在の位置(.
)でファイルのものを検索してみます
構文
find [パス] -type f
例えば先ほど作ったものを-type
で探し出しましょう
find ~/Downloads/*test* -type f
./testfind/index.html
と出てきました
このように特定の位置からtestが含まれるパスにあるファイルを見つけ出します
-type d
で特定の配下にあるディレクトリを検索する
構文
find [パス] -type d
それでは
find ~/Downloads/*test* -type d
./testfind
と出ます
このように特定の位置にあるtest
が含まれるディレクトリを検索できます
-name vs -type -d
これらの違いはなんでしょうか
1
find . -name tesfind
vs
2
find . -type d -name tesfind
1はtestfind
という名前のディレクトリとファイルを全て
2は testfind
という名前のディレクトリ全て
あまりにもディレクトリやそのディレクトリの中が多い時は検索が重くなります。
止めるときは
ctr + c
ダウンロードディレクトリの中でディレクトリの名前がtestfindのそれを見つけてください
答えは一番下
Advance
findで見つけたあとそれに対してアクション(-exec
)を実行しましょう
-exec練習1
testfind内のindex.htmlを同じフォルダの同階層にzipで圧縮する
find ./testfind -name \*.html -exec zip ./testfind/test.zip {} \;
.htmlを zipすることを実行する(-exec部分)。どこに? ./testfind/test.zip
に
./testfind/test.zip {} \;
adding: testfind/index.html (stored 0%)
確認してみましょう
ls testfind
※今いる場所が違う場合はカレント(testfind
があるディレクトリ)までcd
移動してください
index.html test.zip
となっている
つまりこれで、GUIを使わずにコマンドで探して、圧縮できるようになりました
例えばこれで、画像を全てあるコマンドを通して圧縮するとかまとめるとか、削除するとかできそうです
所で先ほどの{} \;
てなに?
{} \;
てなんですか?
{}
は見つかったファイル名を展開する為のもの\
は;
をエスケープしている。(\
を使わず";"
でもいいらしい);
はexec
コマンドを終わる為のもの
60分以内に変更されたファイルを探す
find . -cmin -60
.
./testfind
./testfind/index.html
./testfind/test.zip
./testping.zip
60分以内に変更されたファイルを探す
find / -mmin -60
60分以内にアクセスしたファイルを探す
find / -amin -60
お疲れ様でした!
今回のハンズオン復習の為の課題
-
Donwloadsディレクトリの中に新たに
testfind
というディレクトリを作って、カレントから検索してみてください。
作るところから全てコマンドを使ってやること -
Downloadsにディレクトリtestfind2を作って、カレントからディレクトリ名
testf
以下は任意の文字列で検索をしてください
作るところから全てコマンドを使ってやること -
-typeを使ってDownloads内にあるtestfindのディレクトリを全て検索してください
-
Downloadsにある
png
ファイルを全て探して出力してください -
今探し出したpngファイルの中でその中で好きな文字列を含むpngファイルをzipしてください。zipディレクトリ名は
testping.zip
です -
今作った
zip
ディレクトリをfindで探してください -
findとexecを使ってこの課題で作ったindex.htmlを削除してください(削除コマンド。
rm -f
) -
他のfindで条件検索できる判別式を使ってマスターしてください
-size
を使って50M以上のファイルを出力してみる-size
を使って100M以内のファイルを出力してみる-size
を使って50M以上、100M以内のファイルを出力してみる-size
を使って100M以上の名前にaがつくpngファイルを探して削除してみる-perm
を使って特定のファイルの権限を変えてみる-empty
を使って空なファイル・ディレクトリを探して本当に空かコマンドで調べる-mtime
を使って100日前に変更されたファイルを見つけてみる-atime
を使って50日前にアクセスされたファイルを見つける
これには答えは出しませんので調べてみてください
トラブルシューティング
find: exec: unknown primary or operator
exec
が-exec
となっていないとか
find: -exec: no terminating ";" or "+"
-exec rm -f{}\;
っているとか-exec rm -f {}\;
っているとか-exec rm -f{} \;
っているとか
正しくは
-exec rm -f {} \;
rm index.html {}
になっていてexec
を忘れているとか
find: *.png: unknown primary or operator
-name
,-type
など、何か判別式をつけ忘れてないですか
このページの答え
- ダウンロードディレクトリの中でディレクトリの名前がtestfindのそれを見つけてください
find ~/Downloads -type d -name testfind