こんにちは、鈴木です。
「社内情報共有ツール」での「社内情報共有ツールを運用してみたら意外と一般公開しても OK な情報がわんさか!」の件です。今回はとても奥が深い Linux コマンドに関するナレッジをご紹介します。
scp -C で圧縮転送
scp はサーバ間のファイル転送をするときに良く使うコマンドですが、「圧縮していないログファイルを scp したらなかなか終わらない・・」なんて経験をお持ちの方は多いのではないでしょうか。
そんなときは scp に -C オプションを付けてみてください。データが圧縮されるので転送時間を短くすることができます。scp の -C オプションを知らなかったときは、
1 2 3 |
tar cvfz large.log.tgz large.log scp large.log.tgz <転送先ホスト>:large.log.tgz rm large.log.tgz |
のように圧縮→転送→圧縮ファイルを削除、としていましたが、-C オプションを使うと以下のように 1 行で実現することができます。
1 |
scp -C large.log <転送先ホスト>:large.log |
圧縮したファイルを消し忘れる心配も無いところも嬉しいですね。
tar -C でディレクトリを移動してから処理をする
tar でアーカイブファイルを展開するときに、以下のように cd で展開先ディレクトリに移動してから tar で展開する、ということをしていませんか?
1 2 |
cd /tmp tar xvfz piyo.tgz |
実は tar の -C オプションを使用すると、次のように書くことができます。
1 |
tar xvzf piyo.tgz -C /tmp |
-C オプションを使うと、指定したディレクトリに移動してから処理が行われます。
xargs -r で入力が無ければ何もしない
xargs というコマンドをご存知でしょうか?
xargs は標準入力を 1 行ずつ読み込み、それを引数にコマンドを実行してくれます(引数の長さに応じてコマンドが 1 回以上実行されます)。
例えば以下のようにすると拡張子が .sh のファイルに実行権限を付けることができます。
1 |
find -name '*.sh' | xargs chmod +x |
ところで xargs を使うときに良くあることとして、入力が 1 行も無い場合にコマンドがエラーになってしまう場合があります。
上記コマンドを実行したときに、拡張子が .sh であるファイルが一つも無いと、次のようになります。
1 2 3 |
$ find -name '*.sh' | xargs chmod +x chmod: `+x' の後にオペランドがありません 詳しくは `chmod --help' を実行して下さい。 |
xargs に -r オプション(--no-run-if-empty オプション)をつけておくと、xargs への入力が空の場合は何も実行しないようになります。つまり、上記のようなエラーを回避することができます。
1 |
$ find -name '*.sh' | xargs -r chmod +x |
リダイレクトするには sudo しなければ・・
ディスクキャッシュを削除しよう!
1 2 |
$ echo 1 > /proc/sys/vm/drop_caches bash: /proc/sys/vm/drop_caches: 許可がありません |
おっと、一般ユーザでは書き込み権限は無いですもんね。sudo しないと・・、
1 2 |
$ sudo echo 1 > /proc/sys/vm/drop_caches bash: /proc/sys/vm/drop_caches: 許可がありません |
むむむ、これだと echo コマンドが sudo で実行されただけだから、、、sudo を付けるのはこっちか!
1 |
echo 1 > sudo /proc/sys/vm/drop_caches |
これで大丈夫なのかな・・ちょっと ls してみよう。。
1 2 |
$ ls sudo ... |
おっと!「sudo」というファイルができてるよ!
という経験はお持ちでしょうか?
以下のように tee を使うとやりたいことは実現できます。
1 |
echo 1 | sudo tee /proc/sys/vm/drop_caches > /dev/null |
まとめ
他の人のナレッジを教えてもらうと、「あっこんな使い方があったんだ!」という発見があって面白いですね。