*趣旨 [#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)) } * gitの日本語ファイル文字化けしなくする [#d5b0e796] git config --global core.quotepath false * gitのブランチ名取得 [#g6ede341] git symbolic-ref --short HEAD * gitで新規に、ブランチをpush [#i74a2ffc] git push --set-upstream origin `git symbolic-ref --short HEAD` * コマンドプロンプトの色付けとgitの色付け [#q954bd51] parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ " ** 参考 [#h94a8f7e] https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt * macで複数ターミナルで、任意のコマンドを実行 [#tf79be82] Dockerで、複数サーバを立ち上げ、それぞれのサーバの出力を見るため、 複数ターミナルで立ち上げたい。 そんな時に使える 以下を ~/new.sh として保存 #!/bin/sh test $# -eq 0 && set -- : osascript - "$(pwd)" "$@" <<\EOF on run args set dir to quoted form of (first item of args) set cmd_strs to {} repeat with cmd_str in rest of args set end of cmd_strs to quoted form of cmd_str end set text item delimiters to " " set cmd to cmd_strs as Unicode text tell app "Terminal" to do script "cd " & dir & " && " & cmd end EOF chmod +x ~/new.sh ** 使用例 [#z14c9275] #!/bin/sh cd ~/prj1 ~/new.sh rails s -p 3000 ~/new.sh rails s -p 3001 *** 引用元 [#ba8024e5] https://teratail.com/questions/12738