趣旨

再び探さなくても良いようにメモします。

目次

日付を得る

`date '+%Y%m%d'`

ファイルパスからファイル名や拡張子を自由に取り出す

紹介URL http://d.hatena.ne.jp/zariganitosh/20100921/get_file_name_ext_dir

fpath='/a/b/c.d.e'

ファイル名を取り出す(拡張子あり)

fname_ext="${fpath##*/}" echo $fname_ext

結果

c.d.e

ファイル名を取り出す(拡張子なし)

fname="${fname_ext%.*}" echo $fname

結果

c.d

拡張子を取り出す

fext="${fpath##*.}" echo $fext

結果

e

ディレクトリを取り出す

fdir="${fpath%/*}" echo $fdir

結果

/a/b

補足

関数

所感

同じプロセス内で実行されるので、ディレクトリの移動をおこなうと関数の終了時にカレントディレクトリが変更される。 作業の環境変数自体をなんとかしたい場合にシェルスクリプトをつかうよりも有効なのだろうと思う。

なので、

という作りが便利なのだろう。

関数の書き方

function myfunc() {

}

関数の内部はインデントをつかうことで読みやすさが格段にアップする。

ファイル検索と連携した処理

ファイルの検索結果に対していろいろ処理をしたい場合、ディレクトリ構造をそのまま保存しての処理がBSD版のcpコマンドでは難しかったりするが、下記のようにwhile read 変数名; do とすることで対処できる。

find . -type f ! -path "*a.txt" ! -path "*b.txt" ! -path "*c.txt" | while read f; do 
echo $f
mkdir -p $mergedir/${f%/*}
cp -a $f $mergedir/${f%/*}
done
echo "ok"

シェルスクリプトで並列実行

参考元

http://www.bulkitem.com/2011/09/blog-post.html

コード例

#!/bin/sh

curl -O 'http://domain/1.jpg?1'  & # 1M程度の画像
PID=$!
curl -O 'http://domain/2.jpg?2'  & # 1M程度の画像
wait $PID
wait $!

echo "END"

history

コマンドの履歴を重複を削って並べる

history | awk '{ $1=""; print $0}'|sort|uniq

文字列を一括置換

http://rakkyoo.net/?p=657

find . -name "*.csv" | xargs grep -l test | ruby -i -ep 'gsub!(/test/,"tttt")'

シェルスクリプトでPATHの追加と削除

http://d.hatena.ne.jp/Hoshi-KN/20120129/1327834914

 #!/bin/sh
path_tool1=/opt/tool1
#PATHに上記のpath_tool1で指定したパスがあれば削除
if [ `echo $PATH | grep -e $path_tool1` ] ; then
   PATH=`echo $PATH | sed -e "s@$path_tool1:\{0,1\}@@"`
   export PATH
fi
unset path_tool1
path_tool2=/opt/tool2
#PATHに上記のpath_tool2で指定したパスがなければ追加
if [ ! `echo $PATH | grep -e $path_tool2` ] ; then
   PATH=$path_tool2:$PATH
   export PATH
fi
unset path_tool2

日付フォーマット付きで設定

DATE=`date +'%Y%m%d-%H%M'`

bashで引数に配列を設定する方法

function foo() {
    local arrayname=$1
    eval ref=\"\${$arrayname[@]}\"
    local list=( ${ref} )
    for i in "${list}"; do
        echo "${i}"
    done
}
 
hoge=( 'xxx' 'yyy' 'zzz' )
foo hoge

情報源

小粋空間

http://www.koikikukan.com/archives/2013/09/13-025555.php

ファイルのタイムスタンプを取得

#!/bin/sh
TARGET=$1
if [ "$TARGET" == "" ]; then
echo "パラメータを指定してください。";
elif [ -f $TARGET -o -d $TARGET ]; then
TIMESTAMP=`ls -d -l --time-style='+%Y%m%d' $TARGET | awk '{print $6; }'`;
TARGET_PATH=`dirname $TARGET`
TARGET_BODY=`basename $TARGET`
if [ "$TARGET_PATH" != "" ]; then
TARGET=$TARGET_PATH/$TARGET_BODY
else
TARGET=$TARGET_BODY
fi
echo "mv $TARGET $TARGET.$TIMESTAMP"
#mv $TARGET $TARGET.$TIMESTAMP
else
echo "指定されたファイルまたはディレクトリは存在しません。";
fi

情報源

http://typista.it-creates.com/dos/304.html

当日以外のログファイルは、年月日のフォルダをつくって格納する

いままで、学んできたことを組み合わせて、シェルの関数を作りました。

function logmove(){
DATE=`date +'%Y%m%d'`

\ls -1 *.log | while read TARGET;do
FILEDATE=`ls -d -l --time-style='+%Y%m%d' $TARGET | awk '{print $6; }'`;
FILEDAY=`ls -d -l --time-style='+%d' $TARGET | awk '{print $6; }'`;
FILEMONTH=`ls -d -l --time-style='+%m' $TARGET | awk '{print $6; }'`;
FILEYEAR=`ls -d -l --time-style='+%Y' $TARGET | awk '{print $6; }'`;

if test $FILEDATE != $DATE ; then
mkdir -p ./$FILEYEAR/$FILEMONTH/$FILEDAY
echo mv ./$TARGET ./$FILEYEAR/$FILEMONTH/$FILEDAY/
fi
#echo $FILEDATE
done
}

csvでループさせる例

for X in `echo ${STOCKSHOP_AGENT} | tr -s ',' ' '`; do
  sh ${JENKINS_HOME}/JenkinsTools/sh/release_detail_data_reset.sh ${stockshop_flg} ${STOCKSHOP_SEASON} ${X} ${skill_flg} 0 0 ${upgrade_flg} 0 0
 done
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS