簡體   English   中英

要運行.sh Linux Shell腳本重命名文件

[英]Want to run .sh Linux shell Scripting to rename file

我想運行一個.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

現在,您已經使它變得更清晰了,我想這就是您想要的:

  • 將“ 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進行任何操作之前對其進行declare -A assoc_array

bash您可以設置字符串間隔,設置offsetlength並執行${string:offset:length} 串聯是通過字符串的並置來執行的,並且賦值之間必須在left_value=right_value之間沒有空格。

另外,由於已經使用了-d標志,因此您可以使用tr命令將字符串從initialinitial_without_characters 您可以查看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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM