前提・実現したいこと
CSVファイルをソースフォルダから格納先に移動し、格納先で削除するという処理をシェルで実装したいです。
具体的には末尾の日付のみが違うファイルがある場合にタイムスタンプが古いファイルか格納先に移動し、格納先フォルダのファイルをすべて削除した後、ソースフォルダに残っているタイムスタンプが新しいファイルを移動し、削除というループ処理をしたいです。
※日付のみ違うファイルは3つ以上あることを想定しています。
日付が最も古いファイルを移動する処理の実装でファイルから日付部分を取得する方法はわかるのですが、下記の実装方法を教えてください。
・最も日付が古いファイルを取得する
⇒取得したファイル名($f)を配列に格納し、日付部分を比較し、最も古いファイルをmvで移動する
また、IF文やループをたくさん記述しないといけないので、他の効率的なコードの書き方がないかを教えてほしいです。
/src/csv
FILE_A_yyyymmddhhmmss
FILE_A_yyyymmddhhmmss
FILE_A_yyyymmddhhmmss
FILE_B_yyyymmddhhmmss
FILE_B_yyyymmddhhmmss
該当のソースコード
bash
1 2############### ローカル変数定義 ############### 3# ディレクトリ 4CSV_SRC_DIR="/src/csv" # ソースディレクトリ 5CSV_DST_DIR="/dst/csv" # 格納先ディレクトリ 6 7# 検索キー 8KEY_A=FILE_A 9KEY_B=FILE_B 10 11# カウント初期化 12KEY_A_count=0 13KEY_B_count=0 14 15############### メイン処理 ############### 16while <フォルダが空になるまで>; do 17 18 #ディレクトリ移動 19 cd $CSV_SRC_DIR 20 21 # ファイル名取得 22 array=($(ls -1tr /src/csv)) 23 24#ファイル名別の数をカウント 25 for f in ${array[@]}; do 26 27 if [[ $f == "$KEY_A"* ]]; then 28 KEY_A_count=`expr $KEY_A + 1` 29 30 elif [[ $f == "$KEY_B"* ]]; then 31 KEY_B_count=`expr $KEY_B + 1` 32 done 33 34# ファイル移動 35 for f in ${array[@]}; do 36 if [[ $f == "$KEY_A"* ]]; then 37 if [ $KEY_A_count -eq 1 ]; then 38 mv $f $DST_DIR/RENAME_A.csv 39 40 # 日付のみ違うファイル名が複数ある場合、タイムスタンプが古いファイルから格納フォルダに移動 41 elif [ $KEY_A_count -gt 1 ]; then 42 # 日付が最も古いファイルを移動 43 if [[ $f == "$KEY_A"* ]]; then 44 array=("${array[@]}" "$f") 45 DATE=`echo ${f##*_} | sed 's/.[^.]*$//'` 46 fi 47 else 48 : 49 fi 50fi 51 52 if [[ $f == "$KEY_B"* ]]; then 53 if [ $KEY_B_count -eq 1 ]; then 54 mv $f $DST_DIR/RENAME_B.csv 55 56 # 日付のみ違うファイル名が複数ある場合、タイムスタンプが古いファイルから格納フォルダに移動 57 elif [ $KEY_B_count -gt 1 ]; then 58 # 日付が最も古いファイルを移動 59 if [[ $f == "$KEY_B"* ]]; then 60 array=("${array[@]}" "$f") 61 DATE=`echo ${f##*_} | sed 's/.[^.]*$//'` 62 fi 63 else 64 : 65 fi 66 fi 67 68 69 done 70 71rm -f $CSV_DST_DIR 72done
回答3件
あなたの回答
tips
プレビュー