1

我想运行一个 .sh 脚本来重命名desktop/reports/don我计算机目录中的文件。我需要的一个例子是重命名:

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

TACOS_20130122_005000.csv

我有以下使用 Windows 批处理脚本(.bat 文件)创建的脚本。我想把它转换成 linux shell 脚本。

@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

现在你说得更清楚了,我想这就是你想要的:

  • 将“MONTH NAME”映射到“MONTH NUMBER”的关联数组;
  • 将文件从“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您可以采用字符串间隔,设置 an offset, alength和doing ${string:offset:length}。连接是通过字符串的并置来执行的,并且赋值之间不能有空格left_value=right_value

此外,您有tr命令,将您的字符串从initialto翻译initial_without_characters,因为该标志-d已被使用。您可以查看以man 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 回答