如何编写一个shell脚本来重命名linux中的文件?
前任:
234-2020-08-06-12-13-14-abc_up.csv
被重命名为
234-abc_up-2020-08-06-12-13-14.csv
答案1
这个 shell 脚本可以完成这个工作:
#!/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]
.
所以,shell 脚本可能看起来像
#!/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 -EETC。)”