-1

在编写 bash 脚本时需要帮助,该脚本将重命名作为文件名输出的文件 name.suffix.date 我需要将这些文件改写为 name.date.suffix。

编辑:将后缀从日期更改为〜这是我到目前为止的内容:

find . -type f -name "*.~" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/~//"`
   mv "$f" "$new"
done

这会将后缀改回原始后缀,但无法弄清楚如何在扩展名之前获取要命名的日期(fname??)

4

5 回答 5

1

您可以使用正则表达式匹配来拆分原始文件名:

find . -type f -name "*.~" -print0 | while read -d $'\0' f
do
   dir=${f%/*}
   fname=${f##*/}
   [[ $fname =~ (.+)\.([^.]+)\.([^.]+)\.~$ ]] || continue
   name=${BASH_REMATCH[1]}
   suffix=${BASH_REMATCH[2]}
   d=${BASH_REMATCH[3]}

   mv "$f" "$dir/$name.$d.$suffix" 
done
于 2013-03-20T16:07:20.290 回答
1

仅限 Bash 的解决方案:

while IFS=. read -r -u 9 -d '' name suffix date tilde
do
    mv "${name}.${suffix}.${date}.~" "${name}.${date}.${suffix}"
done 9< <(find . -type f -name "*.~" -print0)

笔记:

  • -d ''给你同样的结果-d $'\0'
  • 在读取文件时按点拆分文件名。当然,这意味着如果其他地方有点,它就会破裂。
  • 否则应该适用于几乎任何文件名,包括那些包含空格、换行符和其他有趣业务的文件名。
于 2013-03-20T16:02:15.217 回答
0
  1. 剪切文件名的每个部分:

    FIN=$(echo test.12345.ABCDEF | sed -e 's/[a-zA-Z0-9]*[\\.][a-zA-Z0-9]*[\\.]//')
    DEBUT=$(echo test.12345.ABCDEF | sed -e 's/[\\.][a-zA-Z0-9]*[\\.][a-zA-Z0-9]*//')
    MILIEU=$(echo test.12345.ABCDEF | sed -e 's/'${FIN}'//' -e 's/'${DEBUT}'//' -e 's/[\.]*//g')
    
  2. 按预期粘贴每个部分:

    echo ${DEBUT}.${FIN}.${MILIEU}
    
于 2013-03-20T15:47:29.127 回答
0
rename --no-act 's/\(name-regex\).\(suffix-regex\).\(date-regex\)/\1.\3.\2' *

调整三个正则表达式以适合您的文件名,并--no-act在您对实际重命名文件的结果感到满意时删除。

于 2013-03-20T15:58:09.920 回答
0
  1. 首先创建文件列表并重定向到文件。ls > 文件列表.txt

  2. 在 Perl 中打开文件并逐行读取。使用正则表达式匹配文件的各个部分并像这样捕获它们

    my ($fileName,$suffix,$date)=($WholeFileName=~/(.*)\.(.*)\.(.*)/);

    这应该为您捕获三个单独的变量。现在您需要做的就是将旧文件移动到新文件名。新文件名将是您获得的上述三个变量的串联。$新文件名=$文件名。".".$date.".".$ 后缀。如果您有示例文件名,请发表评论,我可以用简短的脚本回复。Perl 不是唯一的方法。您可以只使用 bash 或 awk 并找到替代方法来执行此操作。

于 2013-03-20T15:38:26.090 回答