ウェブインコ

インコの技術メモ

sh linux シェル

■パーミッション一括変換
find /home/hoge -name \*.cgi -exec chmod 755 {} \;
find ./ -type d -exec chmod 777 {} \;

■文字コード一括変換
for f in `find ./ -name \*.php`;do echo $f;nkf -w --overwrite $f;done

■ファイル名一括変換
.html → .ctp
cd 場所
for i in `ls`;do j=`echo $i | sed -e "s/\.html/.ctp/"`; mv $i $j;done

■よく使う記号
| パイプ、左の値を右に渡す。
 ex)  grep hoge /home/ | grep hage 左の検索結果を右のgrepに
> ファイルに書き込み(ファイルが無ければ作る)。
 ex) grep hoge /home/ | grep hage > text.dat 検索結果をtext.datと言うファイルに書き込む。
  > text.dat こうすると空ファイルができる(になる)。
>> ファイルに追記。
 ex) cat access_log.1 >> access_log.2 access_log1をaccess_log2の後ろに追記。
less ファイル名 ファイルの中身を表示
tail ファイル名 ファイルの中身のおしりを表示
 ex) tail -f access_log
 オプション-fをつけるとリアルタイムで表示されるのでaccess_logなんか見るときは便利。

■特定のファイルの数を調べる
例)hoge 以下にあるファイルで名前に php を含むもの
find ./hoge/ -type f|grep php|wc -l

■コマンドラインで流す例
 まず基本。
 echo "hellow world!";
 ループ
 for i in 1 2 3;do echo $i;done
 for i in `ls`;do du -h -s $i;done
 MySQLとか
 echo "select * from m_site"|mysql -u root -paaaaaa dbname > date.tsv
 ループその2、引数の前をゼロ埋めしたいときなど
 for i in `perl -e 'printf("%03d\n",$_) for 1..10'`;do perl hoge.pl $i;done

■2つのディレクトリ以下の全てのファイルの内容を比較
#!/bin/bash
for f in `find . -name "*.tpl" -print | grep '_e'`
do
g=`echo $f | sed -e 's/_e/_n/'`
h=`diff $f $g`
if [ -n "$h" ]
then
echo $f
echo $h
fi
done

■ディレクトリ以下の全てのファイルの中身を置換え
#!/bin/bash
for f in `grep '/css/' /var/www/html/ -rls`
do
echo $f
/usr/bin/perl -i -pe 's{/css/}{/10css/}gxo' $f;
done

■シェルスクリプトの書き方と実行方法
ファイルを作る
1行目に #!/bin/bash と書く
2行目以下にスクリプトを書く
sh ファイル名

■例
#!/bin/bash
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'WATCHT( '`date +%H:%M`' )' >> watched_`date +%Y%m%d`.dat;
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'uptime' >> watched_`date +%Y%m%d`.dat;
uptime >> watched_`date +%Y%m%d`.dat;
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'free' >> watched_`date +%Y%m%d`.dat;
free >> watched_`date +%Y%m%d`.dat;
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'df -h' >> watched_`date +%Y%m%d`.dat;
df -h >> watched_`date +%Y%m%d`.dat;
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'netstat -at' >> watched_`date +%Y%m%d`.dat;
netstat -at >> watched_`date +%Y%m%d`.dat;
echo '----------' >> watched_`date +%Y%m%d`.dat;
echo 'ps aux' >> watched_`date +%Y%m%d`.dat;
ps aux >> watched_`date +%Y%m%d`.dat;