1

.shスクリプトを実行して、コンピューターのディレクトリdesktop/reports/donにあるファイルの名前を変更したいと思います。私が必要とするものの例は、名前を変更することです:

TACOS_2013-Jan-22__00-50-00_UTC.csv 

TACOS_20130122_005000.csv

Windowsのバッチスクリプト(.batファイル)を使用して作成された次のスクリプトがあります。これをLinuxシェルスクリプトに変換したいと思います。

@echo off
setlocal
for /f "tokens=2-7 delims=_.-" %%A in ('dir /B TACOS_*') do (
  setlocal enabledelayedexpansion
  call :getmonth %%B
  ren TACOS*_*%%A-%%B-%%C*_*%%D-%%E-%%F_UTC.csv TACOS_%%A!mon!%%C_%%D%%E%%F.csv
  endlocal
)


:getmonth
if "%1" equ "Jan" set mon=01
if "%1" equ "Feb" set mon=02
if "%1" equ "Mar" set mon=03
if "%1" equ "Apr" set mon=04
if "%1" equ "May" set mon=05
if "%1" equ "Jun" set mon=06
if "%1" equ "Jul" set mon=07
if "%1" equ "Aug" set mon=08
if "%1" equ "Sep" set mon=09
if "%1" equ "Oct" set mon=10
if "%1" equ "Nov" set mon=11
if "%1" equ "Dec" set mon=12
goto :eof
endlocal

これは私がこれまでにしたことです..助けてください

#!/bin/bash
month["Jan"]=01
month["Feb"]=02
month["Mar"]=03
month["Apr"]=04
month["May"]=05
month["Jun"]=06
month["Jul"]=07
month["Aug"]=08
month["Sep"]=09
month["Oct"]=10
month["Nov"]=11
month["Dec"]=12

directory="desktop/reports/Don/"
for path in "${directory}TACOS_"*; do

    path=${path#${directory}}
    newpath=${path:0:10}${month[${path:11:3}]}${path:15:2}
    newpath=${newpath}__$(tr -d '-' <<< ${path:19:8}).csv

    echo "${directory}${path}" "${directory}${newpath}" # Run this one first!!!
    # mv "YOUR/PATH/${path}" "YOUR/PATH/${newpath}"
done
4

1 に答える 1

1

あなたがそれをもう少し明確にしたので、私はこれがあなたが望むものだと思います:

  • 「MONTHNAME」を「MONTHNUMBER」にマップするための連想配列。
  • ファイルの名前を「TACOS_YYYY-month-dd__HH-MM-SS*.csv」から「TACOS_YYYYmmdd_HHMMSS.csv」に変更します。

bashスクリプトの解決策:

#!/bin/bash
declare -A month
month["Jan"]=01
month["Feb"]=02
month["Mar"]=03
month["Apr"]=04
month["May"]=05
month["Jun"]=06
month["Jul"]=07
month["Aug"]=08
month["Sep"]=09
month["Oct"]=10
month["Nov"]=11
month["Dec"]=12

directory="YOUR/PATH/TACOS_"
for path in "${directory}"*; do

    path=${path#${directory}}
    newpath=${path:0:4}${month[${path:5:3}]}${path:9:2}
    newpath=${newpath}__$(tr -d '-' <<< ${path:13:8}).csv

    echo "${directory}${path}" "${directory}${newpath}" # Run this one first!!!
    # mv "YOUR/PATH/${path}" "YOUR/PATH/${newpath}"

done

これにより、文字列がに変換path=TACOS_2013-Jan-22__00-50-00_UTC.csvされnewpath=TACOS_20130122__005000.csv、初期ファイルmvの名前が作成された新しいパスに変更されます。

説明のように、を使用する操作の前に宣言する必要bashある連想配列を提供します。declare -A assoc_array

ではbash、文字列の間隔を取り、、、を設定し、を実行offsetできlengthます${string:offset:length}。連結は文字列の並置によって実行され、割り当ての間にスペースを入れてはなりませんleft_value=right_value

さらに、フラグが使用されているため、文字列をからにtr変換するコマンドがあります。詳細については、こちらをご覧ください。initialinitial_without_characters-dman tr

編集:

の最新バージョンがないbashため、次のコードを使用できます。

#!/bin/bash
function month() {

    case $1 in
        "Jan") echo "01" ;;
        "Feb") echo "02" ;;
        "Mar") echo "03" ;;
        "Apr") echo "04" ;;
        "May") echo "05" ;;
        "Jun") echo "06" ;;
        "Jul") echo "07" ;;
        "Aug") echo "08" ;;
        "Sep") echo "09" ;;
        "Oct") echo "10" ;;
        "Nov") echo "11" ;;
        "Dec") echo "12" ;;
    esac

}

directory="YOUR/PATH/TACOS_"
for path in "${directory}"*; do

    path=${path#${directory}}
    newpath=${path:0:4}$(month ${path:5:3})${path:9:2}
    newpath=${newpath}__$(tr -d '-' <<< ${path:13:8}).csv

    echo "${directory}${path}" "${directory}${newpath}" # Run this one first!!!
    # mv "YOUR/PATH/${path}" "YOUR/PATH/${newpath}"

done
于 2013-01-22T22:43:33.960 に答える