ひさびさの小ネタ集

ひさびさに小ネタをいくつか投下します。

【目次】

特定ディレクトリー配下に存在するファイルの拡張子をすべて抜き出す

「あるディレクトリー配下に存在するファイルの拡張子をすべて抜き出したい」

そういうことってありませんか?

ファイル数が数千を超えると、目視では辛くなってきますよね。

そこで。

まずはお馴染み、find でディレクトリーのみ抜き出す方法

  • 特定ディレクトリー配下のディレクトリーのみ抜き出す
$ find . -type d

続いて、あるファイルパスから拡張子のみ抜き出す方法

  • 拡張子のみ抜き出す 方法その一
$ file_path='/tmp/foo/bar/aaa.txt'
$ file_extension="${file_path##*.}"
$ echo "${file_extension}"
txt
  • 拡張子のみ抜き出す 方法その二
$ file_path='/tmp/foo/bar/aaa.txt'
echo "${file_path}" | sed 's/^.*\.\([^\.]*\)$/\1/'

以上を組み合わせて、特定ディレクトリー配下に存在するファイルの拡張子をすべて抜き出すシェルスクリプトを書きます。

第一引数に、調べたいディレクトリーのパスを指定してください。

「方法その一」か「方法その二」をコメントアウトして実行してください。

  • 特定ディレクトリー配下に存在するファイルの拡張子を抜き出しリスト化
#!/bin/bash

set -ue

echo -n '' > /tmp/tmp.extensions.list

if [[ ${#} -ne 1 ]]; then
    echo 'Usage:'
    echo '$ bash listing_all_file_extensions.sh /path/to/directory'
else
    while read directory; do
    
        # 方法その一
        while read file_path; do
            file_extension="${file_path##*.}"
            # 拡張子がないファイルはフルパスが返ってくるのでリストには載せない。
            echo "${file_extension}" | grep -v '^/' >> /tmp/tmp.extensions.list
        done < <(find "${directory}" -type f)
        
        # 方法その二
        # 拡張子がないファイルはフルパスが返ってくるのでリストには載せない。
        # find "${directory}" -type f | sed 's/^.*\.\([^\.]*\)$/\1/' | grep -v '^/' >> /tmp/extensions.list
        
    done < <(find "${1}" -type d)
fi

sort /tmp/tmp.extensions.list | uniq > /tmp/extensions.list

exit 0

find コマンドで特定の名前のディレクトリー以下には降りないようにする

find コマンドで検索をかけるとき、あるディレクトリー配下は検索したくないという場合があります。

これを実現するのが -prune オプションです。

僕は最初、使い方が分からなかったので、備忘録としてこのメモを残しておきます。

今回説明する環境のディレクトリー構成

  • /tmp/foo/bar/111/222/333
  • /tmp/foo/bar/111/aaa
  • /tmp/foo/bar/111/bbb
  • /tmp/foo/bar/111/222/aaa
  • /tmp/foo/bar/111/222/bbb
  • /tmp/foo/bar/111/222/333/aaa
  • /tmp/foo/bar/111/222/333/bbb

特定ディレクトリー以下を検索しない -prune オプション

/tmp/foo/bar/111/222 以下のディレクトリーを検索対象から外す場合は以下のようにする。

  • ファイル名 aaa, bbb のものを検索
$ cd /tmp
$ find ./foo/bar -type d -name '222' -prune -o -name 'aaa' -o -name 'bbb'
./foo/bar/111/aaa
./foo/bar/111/bbb
./foo/bar/111/222 # <- 222 ディレクトリーも表示されてしまう。
  • ファイル名 aaa, bbb のもの「のみ」を検索
$ cd /tmp
$ find ./foo/bar -type d -name '222' -prune -o -type f -name 'aaa' -print -o -type f -name 'bbb' -print
./foo/bar/111/aaa
./foo/bar/111/bbb

なお、find コマンドのオプションは暗黙の -and が省略されています。厳密に書くと以下のようになります。

$ find ./foo/bar -type d -and -name '222' -prune -o -type f -and -name 'aaa' -print -o -type f -and -name 'bbb' -print

チェックボックスやチェックマークを Textile 記法で使う


ずばり以下のように書くだけ。

(Textile 記法は直接 HTML コードを書くことができる)

マークの種類 マーク表記 HTML Decimal
チェックボックス (チェックなし) &#9744;
チェックボックス (チェックあり) &#9745;
チェックマーク &#10003;
太いチェックマーク &#10004;

h2. Todo

---

&#9744; やること 1
&#9744; やること 2 
&#9744; やること 3

参考

Tick symbol in HTML/XHTML - Stack Overflow http://stackoverflow.com/questions/658044/tick-symbol-in-html-xhtml

? (0x2610 in Unicode hexadecimal [HTML decimal: &#9744;]): an empty (unchecked) checkbox
? (0x2611 [HTML decimal: &#9745;]): the checked version of the previous checkbox
? (0x2713 [HTML decimal: &#10003;])
? (0x2714 [HTML decimal: &#10004;])

PowerShell で GNU find

GNU の $ find -name foo っぽいことを PowerShell でやる。

ls -r | where { $_.Name -match "foo" }

RealForce 87UB 静音モデルを Windows 7 で使う

Windows 7 Professional 日本語版にて US キーボードを使うために行った設定のメモ。

  • 87 キーのキーボードを使用したい(RealForce 87UB)。
  • 右 Alt を半角/全角キーとして使いたい。

「AX キーボード用ドライバー」いうものを使うと、サクッとこれらの条件を満たすことができた。

レジストリーを変更して US キーボードレイアウトに変更する。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servicec\i8042prt\Parameters

名前 種類 データ
LayerDriver JPN REG_SZ kbdax2.dll
LayerDriver KOR REG_SZ kbd101a.dll
OverrideKeyboardIdentifier REG_SZ AX_105KEY
OverrideKeyboardSubtype REG_DWORD 0x00000001 (1)
OverrideKeyboardType REG_DWORD 0x00000007 (7)

右 Alt が無いノートパソコンで作業するとき

Ctrl + Alt, Fn + Alt で右 Alt になるらしい。

【おまけ】コロンとセミコロンを swap する。

デフォルトでコロン、Shift と同時押しでセミコロンにしたかったので AutoHotKey を使用してカスタマイズした。.ahk ファイルを .exe に変換し、スタートアップに登録。