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
所望の動作が行われる。
sed
POSIX文字クラスがわからない場合[[: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など。)」