Gentoo」カテゴリーアーカイブ

Gentoo Linuxおよび他のディストリビューションを含むLinux全般についてのカテゴリーです。

findコマンドと-execオプションの使い方

findはディレクトリ内のファイルを検索するためのコマンドです。
基本的な使い方は以下の通りです。

$ find ./
.
./01
./01/aaa.txt
./01/bbb.txt
./01/ccc.jpg
./02
./02/ddd.png
./02/eee.zip

findと検索したいディレクトリを入力するとディレクトリ内のファイルを表示してくれます。

ワイルドカードで検索するファイル名を指定

特定のファイル名のみ検索したい場合は-nameオプションが使えます。
使い方は次のような感じです。

$ find ./ -name "*.txt"
./01/aaa.txt
./01/bbb.txt

タイプを指定

ファイル名ではなくファイルの種類(通常ファイルとかディレクトリとか)を指定して
検索したい場合は-typeオプションを使います。

$ find ./ -type f
./01/aaa.txt
./01/bbb.txt
./01/ccc.jpg
./02/ddd.png
./02/eee.zip

fは通常ファイルという意味です。ディレクトリを検索したい場合はdと入力します。

検索したファイルに対してコマンドを実行

検索したファイルに対してコマンドを実行したい場合は-execオプションを使います。
使い方は次のような感じです。

$ find ./ -type f -exec du -h {} \;
4 ./01/aaa.txt
4 ./01/bbb.txt
12 ./01/ccc.jpg
160 ./02/ddd.png
156 ./02/eee.zip

-execに続いて実行したいコマンドを入力します。
最後は\;と入力してください。

{}は検索したファイル名に置き換えて実行されますので、実際には

du -h ./01/aaa.txt
du -h ./01/bbb.txt

のようなコマンドが実行されていることになります。

duはファイルサイズを調べるコマンドです。

-execでパイプ|を使いたい場合

シェル(shell)の基本的な機能としてパイプ(pipe)というものがあります。
これを使ってコマンドの実行結果を次のコマンドに渡すことができます。

$ du -h ./01/aaa.txt | cut -c -1
4

こんな感じで使って、1つ目のコマンド「du -h ./01/aaa.txt」の実行結果「4 ./01/aaa.txt」を2つ目のコマンド「cut -c -1」に渡し、最終的に4という結果を得るという風に使います。

cut -c -1は入力内容の最初の1文字を出力するコマンドです。

パイプはシェルを使う時に便利な機能なのですが、残念ながらfindコマンドでは使うことができません。ですが、少し工夫することで使えるようになります。

$ find ./ -type f -exec sh -c "du {} | cut -c -1" \;
4
4
1
1
1

-execに直接実行したいコマンドを指定する代わりにsh -cを使うという方法です。

-cは指定された文字列をコマンドとして実行するシェル(sh)のオプションですが、これを使ってパイプが使えないという制限を回避できます。

bashとかzshなどでも-cオプションがあるので同じ方法が使えます。

-execでバッククォート`を使いたい場合

これもシェルの基本的な機能なのですが、バッククォートというものがあります。

$ a=`dirname ./01/aaa.txt`
$ b=`basename ./01/aaa.txt`

こんな感じで使うとコマンドの実行結果を変数に保存することができます。

dirnameはディレクトリ部分、basenameはファイル名部分の文字列を表示するコマンドです。

$ echo $a - $b
./01 - aaa.txt

残念ながらこれもfindでは使えません。しかも、バッククォート内で{}が使えないのでsh -cでコマンドを実行するという方法も使えません。

ですが、こちらもちょっとした工夫で目的のコマンドを実行することができます。

$ find ./ -type f | while read line; do
>   a=`dirname $line` && b=`basename $line` && echo $a - $b
> done
./01 - aaa.txt
./01 - bbb.txt
./01 - ccc.jpg
./02 - ddd.png
./02 - eee.zip

注意点ですが、パイプ以降の部分はfindコマンドではないので{}は使えません。$lineで1行ごとの出力結果を得られるので、それを使う形になります。

※パイプを使わずfindの実行結果をテキストファイルに保存しても同じことができます。

コマンドラインを使った全角⇔半角の変換方法

nkfsedを使ってコマンドラインから全角⇔半角の変換をする方法についてのまとめ。

全角⇒半角の変換

nkfを使う場合

全角から半角へはnkf-Zオプションで変換できます。

全角英数字を半角英数字に変換

$ echo 'あいうえお 123456 abcdef' | nkf -Z
あいうえお 123456 abcdef

全角英数字と全角スペースを半角に変換

$ echo 'あいうえお 123456 abcdef' | nkf -Z1
あいうえお 123456 abcdef

全角英数字と全角スペースを半角に変換(全角スペースは半角スペース2つに変換)

$ echo 'あいうえお 123456 abcdef' | nkf -Z2
あいうえお  123456 abcdef

sedを使う場合

$ echo 'あいうえお 123456 abcdef' | sed 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /'
あいうえお 123456 abcdef

半角⇒全角の変換

sedを使う場合

$ echo 'あいうえお 123456 abcdef' | sed 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /'
あいうえお 123456 abcdef

数字だけ全角に変換したい場合

$ echo 'あいうえお 123456 abcdef' | sed 'y/1234567890/1234567890/'
あいうえお 123456 abcdef

※コマンドはすべて1行です。改行しないように注意してください。

Raspberry Piにプロキシサーバーをインストールする方法

Raspberry Piにプロキシサーバー「Squid」をインストールするメモ。

インストール

$ sudo apt install squid

設定

設定ファイルは/etc/squid/squid.confになります。
お好みのエディタで編集してください。

$ sudo vi /etc/squid/squid.conf

Squidの起動

$ sudo service squid start

起動後、設定ファイルをリロードしたい場合は次のようにします。

$ sudo service squid reload

Squidの設定メモ

使用ポートを3128番に設定して、すべてのアクセスを許可

http_port 3128

acl all src 0.0.0.0/0
http_access allow all

特定のIPアドレスからのアクセスのみ許可

http_port 3128

acl host src 192.168.0.12/32
http_access allow host

acl all src 0.0.0.0/0
http_access deny all

IPアドレスを範囲で許可したい場合は192.168.0.0/24192.168.0.1-192.168.0.255
のような形式で設定することもできます。

特定のドメインのみアクセスを許可

http_port 3128

acl allowlist dstdomain "/etc/squid/allowlist"
http_access allow allowlist

acl all src 0.0.0.0/0
http_access deny all

allowlist

www.example.com
.example.net

のように許可したいドメインを記述します。

.から始まるドメインはサブドメインすべてが許可される設定になります。

特定のIPアドレスから特定のドメインのみアクセスを許可

http_port 3128

acl allowlist dstdomain "/etc/squid/allowlist"
http_access deny !allowlist

acl host src 192.168.0.12/32
http_access allow host

acl all src 0.0.0.0/0
http_access deny all

その他の設定

以下は必要な場合のみ/etc/squid/squid.confに追加してください。

プロキシサーバーを経由しているという情報を隠したい場合

forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
visible_hostname unknown

リファラー情報を送信したくない場合

request_header_access Referer deny all

リンク

FrontPage – Squid Web Proxy Wiki
https://wiki.squid-cache.org/