特定の名前構造にファイル名を変更するには?

特定の名前構造にファイル名を変更するには?

Linuxでファイル名を変更するシェルスクリプトを書くには?

前任者:

234-2020-08-06-12-13-14-abc_up.csv

次に名前が変わりました。

234-abc_up-2020-08-06-12-13-14.csv

答え1

このシェルスクリプトは次のタスクを実行します。

#!/bin/bash
old_filename=$1
IFS='-' read -r -a arr <<< $old_filename    # read dash-separated substrings into the array 'arr'
tmpsub=${arr[7]%.csv.gz}                    # extract 7th substring, stripping out the file extension
for i in $(seq 6 -1 1)                      # shifts right the substrings
do                                          # in the array by one 
    arr[$(($i+1))]=${arr[$i]}               # position, starting by 1
done
arr[1]=$tmpsub                              # set the substring 1 to the value of the previous 7th substring
new_filename=$(printf -- "-%s" "${arr[@]}") # join the substrings into a dash separated string
new_filename=${new_filename:1}".csv.gz"     # add the extension
mv $old_filename $new_filename              # rename the file

たとえば、名前を付けてrename_csv.shを使用して実行可能にする場合は、元のchmodファイル名のみを使用して次のように呼び出すことができます。

./rename_csv.sh 234-2020-08-06-12-13-14-abc_up.csv.gz

出力は表示されませんが、ファイル名を必要に応じて変更します。

答え2

ファイル名の変換を試すことができますsed(構文ヒントGNU sed)。

例:

echo "234-2020-08-06-12-13-14-abc_up.csv" | sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/'
234-abc_up-2020-08-06-12-13-14.csv

これは以下を見つけるでしょう

  • 「すべての文字列」(「キャプチャグループ」1に保存されています)、その後に
  • タイムスタンプYYYY-MM-DD-hh-mm-ss(例:4桁、5つの「ダッシュ、2桁の数字」)、「キャプチャグループ」2に保存
  • 「最初に発生した期間を除くすべての文字列」、キャプチャグループ4に保存されます。

このパターンは、「キャプチャグループ1」、「キャプチャグループ4」、「グループ2のキャプチャ」に置き換えられ、その後、.csv所望の動作が行われる。

sedPOSIX文字クラスがわからない場合[[:digit:]][0-9]

したがって、シェルスクリプトは次のようになります。

#!/bin/bash

fname="$1"
newname="$(sed -E 's/(.*)-([[:digit:]]{4}(-[[:digit:]]{2}){5})-([^.]+).csv/\1-\4-\2.csv/' <<< "$fname")"

mv "$fname" "$newname"

まずテストし、mvラインを次に交換します。

echo "Would now execute 'mv $fname $newname'"

を使用しない場合は、bashコマンド置換を次のように変更する必要があります。

newname="$(echo "$fname" | sed -Eなど。)」

関連情報