Bash で、再帰的にディレクトリ内のファイルの文字列を置換する方法
find と xargs と sed を組み合わせる
find . -name "*.css" | xargs sed -i 's/置換前文字列/置換後文字列/g'
find と xargs と sed を組み合わせる
find . -name "*.css" | xargs sed -i 's/置換前文字列/置換後文字列/g'
例えば、以下のようにする。echo_count という関数を定義して、スクリプト内からその文字列をカウントしてコール数を合計する(合計値は ${TOTAL} という変数で参照できる)。
#!/bin/bash
export TARGET_DIR='./' # Current directory
export ORIGINAL_NAME='xxxxx'
export TARGET_NAME='yyyyy'
find "${TARGET_DIR}" -name '*${ORIGINAL_NAME}*' -execdir rename "s/${ORIGINAL_NAME}/${TARGET_NAME}/g" '{}' \;
AWS re:Invent 2017 で、AWS の VPC 内で NTP を提供するという地味だが重要なアナウンスがあった。使い方は以下のとおり。
CentOS 系
sudo yum erase ntp*; sudo yum -y install chrony; sudo service chronyd start
Debian/Ubuntu 系
sudo apt-get remove -y ntp*; sudo apt-get -y install chrony; sudo service chronyd start; apt-get autoremove
ssh のコマンドに-o StrictHostKeyChecking=no オプションを追加する
ssh -o StrictHostKeyChecking=no your_username@example.com
あるいは(この方法はあまりうまくいかないかもしれないが・・・)
export TARGET_HOST='example.com'
if [ -z `ssh-keygen -F ${TARGET_HOST}` ]; then
ssh-keyscan -H ${TARGET_HOST} >> ~/.ssh/known_hosts
fi
ssh-keygen -R ${TARGET_HOST}
ssh-keyscan -f ~/.ssh/known_hosts ${TARGET_HOST} >>~/.ssh/known_hosts 2>/dev/null
#!/bin/sh
export DATE_CURRENT=`date +%Y-%m-%d`
export TIME_CURRENT=`date +%Y%m%d%H%M%S`
export PURGE_AFTER_DAYS=30
export PURGE_AFTER=`date -d +${PURGE_AFTER_DAYS}days -u +%Y-%m-%d`
export BACKUP_TAG='backup'
# 1-1 Get the list of instances that you want to get backup バックアップを作成したい EC2 インスタンス一覧を取得する
INSTANCES=`aws ec2 describe-tags --filters "Name=resource-type,Values=instance" "Name=key,Values=${BACKUP_TAG}" | awk '{print $3}'`
for INSTANCE in ${INSTANCES}; do
BACKUP=`aws ec2 describe-tags --filters "Name=resource-type,Values=instance" "Name=resource-id,Values=${INSTANCE}" "Name=key,Values=${BACKUP_TAG}" | awk '{print $5}'`
# 1-2 Check if the instance is marked as backup or not タグを見てバックアップ対象かどうかチェックする
if [ "${BACKUP}" == "true" ]; then
# 1-3 Create a backup バックアップを作成する
AMI_ID=`aws ec2 create-image --instance-id ${INSTANCE} --name "${INSTANCE}_${TIME_CURRENT}" --no-reboot`
# 1-4 Create a tag for search for later use. 検索に使うタグを作成する
aws ec2 create-tags --resources ${AMI_ID} --tags Key=PurgeAllow,Value=true Key=PurgeAfter,Value=$PURGE_AFTER
fi
done
# 2-1 Search backups by tag タグを条件にして削除可能なバックアップを検索する
AMI_PURGE_ALLOWED=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=key,Values=PurgeAllow" | awk '{print $3}'`
for AMI_ID in ${AMI_PURGE_ALLOWED}; do
PURGE_AFTER_DATE=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=resource-id,Values=${AMI_ID}" "Name=key,Values=PurgeAfter" | awk '{print $5}'`
if [ -n ${PURGE_AFTER_DATE} ]; then
DATE_CURRENT_EPOCH=`date -d ${DATE_CURRENT} +%s`
PURGE_AFTER_DATE_EPOCH=`date -d ${PURGE_AFTER_DATE} +%s`
if [[ ${PURGE_AFTER_DATE_EPOCH} < ${DATE_CURRENT_EPOCH} ]]; then
# 2-2 Delete backup if it is marked as backup タグを見て削除対象か判定を行い、対象であればバックアップを削除する
aws ec2 deregister-image --image-id ${AMI_ID}
SNAPSHOT_ID=`aws ec2 describe-images --image-ids ${AMI_ID} | grep EBS | awk '{print $4}'`
aws ec2 delete-snapshot --snapshot-id ${SNAPSHOT_ID}
fi
fi
done
システム変数${PIPESTATUS[X]}を使う。
$ exit 1 | exit 2 | exit 3 | exit 0
$ echo ${PIPESTATUS[@]}
1 2 3 0
ちなみに、Bash では正常終了のコードは0、異常終了は1以上。
Jenkins 側
#!/bin/bash
export TARGET_HOST='{"hostname":"https://example1.com","username":"user1","password":"pass1"} \
{"hostname":"https://example2.com","username":"user2","password":"pass2"}'
export SQS_QUEUE_NAME='eaxmple_queue'
for TARGET_HOST in ${TARGET_HOSTS}; do
export SQS_QUEUE_URL=$(aws sqs get-queue-url --queue-name ${SQS_QUEUE_NAME} --output text)
export SQS_MSG_BODY=${TARGET_HOST}
aws sqs send-message --queue-url ${SQS_QUEUE_URL} --message-body ${SQS_MSG_BODY}
done
以下の例は、/var/www/html/backups のディレクトリを find して、3日以前の backup*.tar.gz を xargs rm -fr で削除する。
find /var/www/html/backups -mtime +2 -name "backup*.tar.gz" | xargs rm -fr
以下のスクリプトで、YOUR_FILENAME のところを対象となるファイル名を指定して実行する。まずは元のファイルを YOUR_FILENAME.org という名前でコピー、オリジナルのファイルを上書きする形で英単語の前後に半角スペースを入れて置換する。
export FILENAME='index.rst'; \
cp ${FILENAME} ${FILENAME}.org; \
cat ${FILENAME}.org | sed y/0123456789/0123456789/ | \
sed -E "s/([^ \t:\*0-9\.,<>\-~a-zA-Z()ー[:punct:]]|\" \w+ )([a-zA-Z])/\1 \2/g" | \
sed -E "s/([a-zA-Z])([^ \t:\*0-9\.,<>\-~a-zA-Z()ー[:punct:]]| \w+ \"$)/\1 \2/g" > ${FILENAME}
HTML 文書の中でこの置換を行いたい場合、<span>...</span> によって見えないスペースが加えられていることがあるため、以下のスクリプトで対応する。