「Unix (Linux)」カテゴリーアーカイブ

Linuxのタイムゾーン設定(timedatectlを使う方法)

今時のLinuxならsystemd使ってるので、timedatectlコマンド使えば一発で設定できます。

$ date
Tue Feb 18 20:43:20 UTC 2020

$ sudo timedatectl set-timezone Asia/Tokyo ←これ

$ date
Wed Feb 19 05:43:35 JST 2020

list-timezones引数でタイムゾーンリスト表示。

$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra

UTC

引数なしで現在の状態を確認。

$ timedatectl
Local time: Wed 2020-02-19 05:48:30 JST
Universal time: Tue 2020-02-18 20:48:30 UTC
RTC time: Tue 2020-02-18 20:48:30
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no

昔はOSのインストール途中でタイムゾーン設定してたけど、今時はAWS EC2とかGCP ECとかイメージコピーして立ち上げる機会が多くてデフォルトUTCになってるんでサクッっと設定しておきましょう。

seqコマンドでゼロサプレスなし(先頭0付け)あれこれ

seqコマンドのゼロサプレスなし(ゼロ抑制なし=先頭に0を付ける)のやり方を度々忘れるので備忘録として書いておく。

まず普通にseq。(便宜上INCREMENT=50にしてる)

$ seq 1 50 101
1
51
101

桁合わせに0を入れたいなら単純に-wオプションでOK。

$ seq -w 1 50 101
001
051
101

seqコマンドには-fというprintfと同様の書式が使えるオプションが用意されているのでこれを使う手もある。ただしオプション説明に“use printf style floating-point FORMAT”とあるのであくまでも浮動小数関連フォーマット指定になる。つまり%02gはOKだけど%02dはダメ。

ゼロサプレスなしの最低二桁。

$ seq -f %02g 1 50 101
01
51
101

ゼロサプレスなしの三桁。

$ seq -f %03g 1 50 101
001
051
101

ゼロサプレスなしの四桁。

$ seq -f %04g 1 50 101
0001
0051
0101

cygwinで改行コード変換

cygwinでテキストファイルの改行コードを変更するときは、unix2dos, unix2mac, dos2unix, mac2unix コマンドを使うと簡単にできます。-hオプション付けると詳細な使い方が表示されますが、ほとんどの場合は引数に変換対象ファイル名を指定すれば事足りると思います。

・元のファイルはUnix改行コード。(LF)
$ file sample.txt
sample.txt: ASCII text

・Windows,DOS改行コードに変換。(CRLF)
$ unix2dos sample.txt
unix2dos: converting file sample.txt to DOS format …
$ file sample.txt
sample.txt: ASCII text, with CRLF line terminators

・Mac改行コードに変換。(CR)
$ unix2mac sample.txt
unix2mac: converting file sample.txt to Mac format …
$ file sample.txt
sample.txt: ASCII text, with CR line terminators

認識しなくなった REGZA 外付け HDD を「REGZA HDD Easy Repair」で直した

REGZA 37Z9000 の外付けHDD(ベアドライブ・SATA-USB変換ケーブルで接続)が突然認識しなくなりました。いや、認識しなくなったというか、USBを接続し直すと新しいHDDとして再登録&フォーマットを要求されるようになってしまった。こうなる直前は録画番組が再生できたりできなかったりという不安定な状態でした。

録画済み番組が大量にあるのでなんとか復旧させようといろいろ調べたらレグザHDD復旧ソフト「REGZA HDD Easy Repair」(またはここ)なるものを公開してる人がいたので試したら直った!GJ!

復旧手順はリンク先に書いてあるので省略。ちなみに私は Xubuntu 11.10 (32bit) を使いました。一度64bit版で試したら復旧ツールのインストールができませんでした。また、LAN接続してないとインストールできなかったような気がしますが何かの間違いかもしれません。

復旧後は問題なく使えてます。

lessで圧縮テキストファイルを見る方法

Macのlessコマンドでcompressやgzip圧縮されたテキストファイルを自動展開して閲覧できるようにするやりかた。(Macに限った話ではないですけどね…)
1. lesspipe.shファイルをどこかに作成する。

#!/bin/sh
case "$1" in
*.Z) uncompress -c $1 2>/dev/null ;;
*.gz) gzip -dc $1 2>/dev/null ;;
*.bz2) bzip2 -dc $1 2>/dev/null ;;
esac

2. lesspipe.shに実行権限を付与。

chmod +x lesspipe.sh

3. LESSOPEN環境変数を以下のように設定。lesspipe.shのパスは環境に合わせて変更すること。

export LESSOPEN="|~/Documents/shells/lesspipe.sh %s"

以上で、less readme.txt.gz などとすれば拡張子にあわせて自動的に展開してくれるようになります。詳しいことはlessのオンラインマニュアル(man less)を参照。
ターミナル起動するたびに有効にしたいときは.bashrcにexport LESSOPEN…行を書いておけばいいのですが、Macだと多分.bashrcも.bash_profileもないでしょうからそれぞれ以下のように設定しておいてください。
~/.bashrc

export LESSOPEN="|~/Documents/shells/lesspipe.sh %s"

~/.bash_profile

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

-h : human readable オプション

昔はUnixコマンドの-hオプションといえばヘルプだったような気がするのですが、今はhuman readableな出力処理が割り当てられているコマンドが結構あります。以下はlsコマンドのオンラインマニュアルからの引用。関連オプション--siも一緒に引用。

-h, --human-readable
with -l, print sizes in human readable format (e.g., 1K 234M 2G)
--si   likewise, but use powers of 1000 not 1024

つまり人間が見てわかりやすいようにキロバイトならK、メガバイトならMを付けた形で表示してくれるということです。--siは国際単位系に合わせて基数1000で表示します。(付けなければ基数1024)

実行結果は以下のとおり。

$ ls -l
total 2128
-rw-r--r-- 1 foo  foo        1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo     1000 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo     1024 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  1000000 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1048576 2010-01-16 09:40 test.1MiB

$ ls -lh
total 2.1M
-rw-r--r-- 1 foo  foo     1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo  1000 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo  1.0K 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  977K 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1.0M 2010-01-16 09:40 test.1MiB

$ ls -lh --si
total 2.2M
-rw-r--r-- 1 foo  foo     1 2010-01-16 09:41 test.1B
-rw-r--r-- 1 foo  foo  1.0k 2010-01-16 09:39 test.1KB
-rw-r--r-- 1 foo  foo  1.1k 2010-01-16 09:39 test.1KiB
-rw-r--r-- 1 foo  foo  1.0M 2010-01-16 09:40 test.1MB
-rw-r--r-- 1 foo  foo  1.1M 2010-01-16 09:40 test.1MiB

わかりやすくていいですね。ls以外でもdfやduなどで使えます。

watchコマンド:プログラムを定期的に実行してフルスクリーンで表示

UnixやLinuxのようなCUI画面ではコマンドの実行結果が次の行に表示されますが、同じコマンドを連続実行するときは実行結果を同じ位置に表示し続けるほうが見やすい場合もあります。そんなときに使えるのがwatchコマンドです。watchコマンドは引数で指定したコマンドを定期的に実行してフルスクリーンで表示してくれます。

watch date

日本語が通らないようなのでLANG=Cでデフォルトロケールにしたほうがよいかもしれません。

LANG=C watch date

コマンド実行インターバルは-nオプションで指定。デフォルトは2秒なので、1秒間隔で実行したいときはこうします。

watch -n 1 date

-dオプションを付けると更新箇所をハイライトしてくれます。

watch -n 1 -d date

watchコマンドはLinuxならたぶん使えます。他のOSはわかりません。どなたかがportingしたものがどこかに落ちてるかもしれません。FreeBSDのwatchコマンドはttyの監視という全く別のコマンドなので気をつけましょう。watchコマンドがないときはこんなやりかたもあります。

while true; do clear; LANG=C date; sleep 1; done

ddコマンドで固定長ファイル作成

テストデータとして固定長ファイルを作成するときはddコマンドを使うと簡単に作れます。1MBの空のファイル(全データnull文字)を作成する方法は以下のとおり。

dd if=/dev/zero of=zero1MB1.dat count=1024 bs=1024
dd if=/dev/zero of=zero1MB2.dat count=1024 bs=1K
dd if=/dev/zero of=zero1MB3.dat count=1 bs=1M

ifはデータ入力元、ofはデータ出力先、bsは1回当たりの処理量をバイトで指定、countは処理の回数。なので、上の3つのコマンドの生成ファイルは全て空の1MBのファイルになります。

1MBのランダムファイル(データは乱数)を作成する方法は以下のとおり。

dd if=/dev/urandom of=urandom1MB.dat count=1024 bs=1024

forとかseqコマンドと組み合わせると複数ファイルの生成を自動化できます。

for i in `seq 0 9`
do
dd if=/dev/urandom of=urandom1MB$i.dat count=1024 bs=1K
done

これでurandom1MB0.datからurandom1MB9.datまでの10個の固定長乱数ファイルを一気に作れます。注意点ですが、ddのofで上書き可能なファイルが指定されたとき、ddは容赦なく上書きするので気をつけましょう。