如何重命名具有特定名称结构的文件?

如何重命名具有特定名称结构的文件?

如何编写一个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。)”

相关内容