忍者ブログ

STEP UP BLOG

Home > ブログ > Linux

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

rsyncのスラッシュありなしの注意点

rsyncでたまに大きいディレクトリを同期し終わってから失敗したとならないための注意。
同期元にスラッシュをつけるかつけないかの話です。
以下、例です。
$ ls
.  ..  dst  src
$ ls src
.  ..  a.txt  b.txt  c.txt
$ ls dst
.  ..

スラッシュあり
$ rsync -avh src/ dst
sending incremental file list
./
a.txt
b.txt
c.txt

sent 226 bytes  received 72 bytes  596.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  a.txt  b.txt  c.txt

スラッシュなし
$ rsync -avh src dst
sending incremental file list
src/
src/a.txt
src/b.txt
src/c.txt

sent 240 bytes  received 73 bytes  626.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  src
$ ls dst/src/
.  ..  a.txt  b.txt  c.txt

スラッシュがあると中のファイルだけを同期させますが、スラッシュがないとディレクトリごと同期させるようになります。
目的によりますが、気をつけないと想定していないディレクトリ構成となって同期してしまうので注意しましょう。
PR

manで調べる

長くエンジニアをやっていても知らないコマンドは多く、
今でもいろいろなコマンドの使い方を調べたりします。
そこでどうするか。
ググるよりもまずはmanですよね。
man最強。
だいたいmanで調べればわかります。
Googleで「何かのコマンド オプション」で検索しても主なオプションは出てきますが、
manには基本的にすべてのオプションが載っているので、
Googleから漏れがちでも意外と有用なオプションも見つけることができます。
このmanにはセクションという概念があって、セクションを指定するとそれに対応する情報が表示されます。
セクションは、
$ man -S 1 ls

のように指定します。
セクション番号は以下の通り。

1 ユーザー・コマンド
2 システム・コール
3 関数やライブラリ・ルーチン
4 特殊ファイル,デバイス・ドライバ,ハードウエア
5 設定ファイルとファイル形式
6 ゲームとデモ
7 その他(文字セット,ファイル・システム・タイプなど)
8 システム管理用コマンド

どのセクションの情報を持っているかは-awオプションでわかります。
$ man -aw echo
/usr/share/man/man1/echo.1
/usr/share/man/man3/echo.3x


という感じで普段使っているコマンドもmanで調べてみて知らなかったオプションを発見してみてはいかがでしょうか。

再帰的にファイルだけ権限を変えたいとき

よくある作業で、あるディレクトリ以下のファイルの権限を全部変えたいときがあります。
そんなときに例えば以下のように
$ chmod -R 777 .

としてしまいがちです。
Enterキーを押してしまった人、ごめんなさい〜
これだと、ディレクトリの権限まで変わってしまいます。
私はファイルだけ権限を変えたかったんだ…
再帰的といいつつ、ファイルだけにchmodを適用したい。
そんなときはUnixお得意のパイプ処理です。
というわけで、ファイルだけ再帰的に権限を変更したい場合は以下。
$ find . -type f | xargs chmod 777

findの-typeオプションでファイルのみを絞って、それをxargsでchmodに渡します。
xargsを使うところが肝です。
man xargsしてみると、
名前
       xargs - 標準入力からコマンドラインを作成し、それを実行する

書式
       xargs   [-0prtx]   [-e[eof-str]]   [-i[replace-str]]   [-l[max-lines]]   [-n   max-args]   [-s   max-chars]  [-P  max-procs]  [--null]  [--eof[=eof-str]]
       [--replace[=replace-str]] [--max-lines[=max-lines]] [--interactive] [--max-chars=max-chars] [--verbose] [--exit] [--max-procs=max-procs] [--max-args=max-
       args] [--no-run-if-empty] [--version] [--help] [command [initial-arguments]]

説明
       このマニュアルページは GNU 版 xargs に関して記述したものである。 xargs はまず標準入力から空白または改行で区切られた文字列群を読み込む (空白はダブルクォー
       テーション・シングルクォーテーション・バックスラッシュによってプロテクトできる)。そして command (デフォルトは /bin/echo) に文字列群を続けたコマンドライン
       を実行する。 initial-arguments が指定されていれば、 command と標準入力から渡された文字列の間に、 command への引き数として渡される。標準入力の空行は無視さ
       れる。

つまり今回の場合はパイプで送られてきたファイル一覧を引数としてchmodを実行してくれます。
なるほど!
パイプを使うとunix使いこなせてる感マシマシになるので頭の片隅にでも留めておいてはいかがでしょうか。

ちなみに
$ find . -type d

だと、ディレクトリのみが抽出されます。

起動スクリプトでのsudoエラーとその解決策

普段はPHPで開発しているのですが、ここ数日はLinuxの起動や終了の流れを調べたり、シェル書いたり、シェル書いたりしてました。
同じIT技術といっても知らないことが多く、頭がこんがらがり中です。
しかし新しいことを覚えると気持ちいいもので、守備範囲が広がると身軽に感じたりします。

今回、OS起動時にしたい処理があり、そのためにいろいろ調べていたのですが、
起動時に実行されるスクリプト(/etc/init.d内のスクリプト)はroot権限で実行されるのですね。
私はそのスクリプト内のある処理を一般ユーザ権限で実行させたかったので、最初は
sudo -u username /hoge/script
と書いていましたが、エラー発生。
調べると、
sudo: sorry, you must have a tty to run sudo
というエラーメッセージが出ていました。
つまりtty(端末)でないところからsudoしているから弾いているというわけです。
解決策を探ったところ、sudoじゃなくてsuでも出来るとのこと。
su - username -c "/hoge/script"
で、めでたく一般ユーザ権限で実行させることに成功しました。
この場合、実行したいコマンドをダブルクオーテーションで囲むことを忘れずに^^

PAGE TOP