[英]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
現在,您已經使它變得更清晰了,我想這就是您想要的:
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
您可以設置字符串間隔,設置offset
, length
並執行${string:offset:length}
。 串聯是通過字符串的並置來執行的,並且賦值之間必須在left_value=right_value
之間沒有空格。
另外,由於已經使用了-d
標志,因此您可以使用tr
命令將字符串從initial
為initial_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.