趣旨

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

目次

日付を得る

`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

再帰的grep

function grp(){
  find . -type f | xargs grep --color -n $1
}

git init

function git_init(){
 git init
 git commit --allow-empty -m 'first commit'
 git checkout -b develop
}

git flow用ブランチ作成ポカミス防止版

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

}

ファイルの中間を抜き出す

function mid(){
  head -n $3 $1 | tail -n $(($3 - $2 + 1))
}

gitの日本語ファイル文字化けしなくする

git config --global core.quotepath false

gitのブランチ名取得

git symbolic-ref --short HEAD

gitで新規に、ブランチをpush

  git push --set-upstream origin `git symbolic-ref --short HEAD`

コマンドプロンプトの色付けとgitの色付け

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\] $ "

参考

https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt

macで複数ターミナルで、任意のコマンドを実行

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

使用例

#!/bin/sh

cd ~/prj1
~/new.sh rails s -p 3000
~/new.sh rails s -p 3001

引用元

https://teratail.com/questions/12738

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS