*趣旨 [#h4a48234]
再び探さなくても良いようにメモします。

*目次 [#k5659dfd]
#contents

*日付を得る [#c80e291e]
`date '+%Y%m%d'`

*ファイルパスからファイル名や拡張子を自由に取り出す [#xee0e691]
紹介URL
http://d.hatena.ne.jp/zariganitosh/20100921/get_file_name_ext_dir

**例 [#j0778d75]
fpath='/a/b/c.d.e'

**ファイル名を取り出す(拡張子あり) [#h6a55448]
fname_ext="${fpath##*/}"
echo $fname_ext
***結果 [#va4bcdd7]
c.d.e


**ファイル名を取り出す(拡張子なし) [#o882e586]
fname="${fname_ext%.*}"
echo $fname
***結果 [#xc41fe49]
c.d


**拡張子を取り出す [#ta5f7bfa]
fext="${fpath##*.}"
echo $fext
***結果 [#o4a009df]
e

**ディレクトリを取り出す [#p70404f3]
fdir="${fpath%/*}"
echo $fdir
***結果 [#w8fd2573]
/a/b

**補足 [#dc1405b9]
-${変数#パターン} 先頭から最短一致した部分を取り除く
-${変数##パターン} 先頭から最長一致した部分を取り除く
-${変数%パターン} 末尾から最短一致した部分を取り除く
-${変数%%パターン} 末尾から最長一致した部分を取り除く

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

なので、
-環境変数を変えたい単位で関数を用意する。
-変数に応じて汎用的に動く関数を用意する。

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


**関数の書き方 [#dc3629c2]
 function myfunc() {
 
 }

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

*ファイル検索と連携した処理 [#zf7166f3]
ファイルの検索結果に対していろいろ処理をしたい場合、ディレクトリ構造をそのまま保存しての処理が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"

*シェルスクリプトで並列実行 [#d8499827]

**参考元 [#ce3b99d7]
http://www.bulkitem.com/2011/09/blog-post.html

**コード例 [#n79f0a8a]
 #!/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 [#r5a8253c]
コマンドの履歴を重複を削って並べる
 history | awk '{ $1=""; print $0}'|sort|uniq

**文字列を一括置換 [#e5c5e1a0]
http://rakkyoo.net/?p=657

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

**シェルスクリプトでPATHの追加と削除 [#cf93478f]
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


*日付フォーマット付きで設定 [#qec1ddb7]
DATE=`date +'%Y%m%d-%H%M'`


*bashで引数に配列を設定する方法 [#ie23caad]

 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


**情報源 [#l0c9dee7]

小粋空間

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

*ファイルのタイムスタンプを取得 [#scced8d8]



 #!/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


**情報源 [#d510e5f3]
http://typista.it-creates.com/dos/304.html


*当日以外のログファイルは、年月日のフォルダをつくって格納する [#q0f19ff7]
いままで、学んできたことを組み合わせて、シェルの関数を作りました。


 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でループさせる例 [#f33c4769]
 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



*再帰的grep [#j85ab907]
 function grp(){
   find . -type f | xargs grep --color -n $1
 }

*git init [#u7917c7b]
 function git_init(){
  git init
  git commit --allow-empty -m 'first commit'
  git checkout -b develop
 }

*git flow用ブランチ作成ポカミス防止版 [#hf329112]
 function mkb(){
   echo '現在のブランチ': `git rev-parse --abbrev-ref @`
   if [ `git rev-parse --abbrev-ref @` = "develop" ]; then
     git pull
     git checkout -b $1
   else
     echo "developブランチに切り替えてサイド実行してください"
     echo "git checkout develop"
 
   fi
 
 }

*ファイルの中間を抜き出す [#g0178632]
 function mid(){
   head -n $3 $1 | tail -n $(($3 - $2 + 1))
 }


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS