※当サイトの記事には、広告・プロモーションが含まれます。

シェルスクリプトでサブディレクトリ名のリストを取得し降順にソートする

gigazine.net

⇧ amazing...

シェルスクリプトでサブディレクトリ名のリストを取得し降順にソートする

日時のフォルダが蓄積されていくシチュエーションがあるとして、最新の日時のフォルダの内容を別のフォルダに配置したかったので、実装してみました。

今回は、突貫工事的にコーディングしてるので、最新の1件だけをピックアップしてますが、最新10件とか、いろいろカスタマイズはできそうかと。

というわけで、以下のような感じになりました。

■/home/ts0818/work/test_subdir/test_subdir.sh

#!/bin/bash

# 対象のディレクトリ
TARGET_DIR=/home/ts0818/work/test_subdir

# 現在日時(YYYYMMDD_hhmmssの形)
CURRENT_DATETIME=$(date '+%Y%m%d_%H%M%S')

# アンダースコアで分割
#DATETIME=(${CURRENT_DATETIME//_/ })

# hhmmssの部分だけ抽出
#TIME=${DATETIME[1]}

# 半角数字とアンダースコアのみ
regex='^[0-9_]'

declare -a SUBDIR_ARR
idx=0

# 検索で見つかったサブディレクトリの数だけ繰り返し
for dir in $(find ${TARGET_DIR} -maxdepth 1 -type d)
do
  # サブディレクトリ名
  subdir=$(basename ${dir})
  echo '[subdir]'"${subdir}"
  
  # フォルダ名が半角数字とアンダースコアのみに絞り込み
  if [[ ${subdir} =~ ${regex} ]]; then
    echo 'match[subdir]'"${subdir}"
    # 配列の要素を追加
    SUBDIR_ARR[${idx}]=${subdir}

    # インクリメント
    idx=$(expr ${idx} + 1)
  fi

done

# 降順にソート
sorted_arr=($(printf '%s\n' "${SUBDIR_ARR[@]}" | sort -r))

for ((arr_idx=0; arr_idx < ${#sorted_arr[@]}; arr_idx++))
do
  echo 'sorted_arr'"[${arr_idx}]${sorted_arr[${arr_idx}]}"
  
done

# 一番最新のフォルダ
MOST_RECENT_DIR=${sorted_arr[0]}

RESULT=RESULT
RESULT_DIR=${TARGET_DIR}/${RESULT}/${MOST_RECENT_DIR}

mkdir -p ${RESULT_DIR}

# 一番最新のフォルダ配下のものを、コピーする
cp ${TARGET_DIR}/${MOST_RECENT_DIR}/* ${RESULT_DIR}/    

⇧ で実行。

意外に、サブディレクトリ名だけ抽出するって情報が見つからんという...

パスにファイルが含まれない状態で、basenameコマンドを使って、フォルダ名を取得するというトリッキーな方法以外に、何かもっと上手い方法があるとは思うんのだけど、良い方法が思いつかないので、今回は、泥臭い方法で実現してます。

毎度モヤモヤ感が半端ない...

今回は、このへんで。