将文件重命名为原始扩展名

时间:2013-03-20 15:29:32

标签: bash

需要帮助编写一个bash脚本,它将重命名作为文件名输出的文件.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 ??)

5 个答案:

答案 0 :(得分: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'
  • 相同的结果
  • 在读取时按点分割文件名。当然这意味着如果其他地方有点,它会破裂。
  • 应该使用几乎任何文件名,包括那些包含空格,换行符和其他有趣业务的文件名。

答案 1 :(得分: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

答案 2 :(得分:0)

  1. 首先创建文件列表并重定向到文件。 ls&gt; Filelist.txt中

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

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

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

答案 3 :(得分: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}
    

答案 4 :(得分:0)

rename --no-act 's/\(name-regex\).\(suffix-regex\).\(date-regex\)/\1.\3.\2' *

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