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

Bash 将文件重命名为原始扩展名,bash,Bash,需要有关编写bash脚本的帮助,该脚本将重命名输出为file 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 这会将后缀改回原始名称,但无法确定如何在扩

需要有关编写bash脚本的帮助,该脚本将重命名输出为file 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??)之前获取要命名的日期

  • 首先创建一个文件列表并重定向到一个文件。 ls>fileList.txt

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

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

    这将为您捕获三个独立的变量。现在,您只需将旧文件移到新文件名。新文件名将是上述三个变量的串联$newFileName=$fileName。“..$date.”.“..$后缀。如果你有一个示例文件名发布评论,我可以用一个简短的脚本回复。Perl不是唯一的方法。您可以使用bash或awk并找到其他方法来实现这一点

  • 剪切文件名的每个部分:

    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')
    
  • 按预期粘贴每个零件:

    echo ${DEBUT}.${FIN}.${MILIEU}
    
  • 调整三个正则表达式以适合您的文件名,并在对结果满意时删除
    --no act
    ,以实际重命名文件。

    Bash-only解决方案:

    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)
    
    而IFS=。read-r-u 9-d“”名称后缀日期波浪号
    做
    mv“${name}.${suffix}.${date}.~”“${name}.${date}.${suffix}”
    
    完成9<您可以使用正则表达式匹配分离原始文件名:

    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
    

    这假设
    name
    将不包含
    。是的,它在notes部分。我得到的文件名为“test2.txt.20130320 95325.~”而不是原来的“test2.txt.20130320.~”?@jmituzas,因为您需要更精确。原始文件的全名是什么?如果它确实包含一个波浪形字符而不是日期,则需要更新您的问题。你说的“获取文件”是什么意思?我向您保证,此代码不会将
    test2.txt.20130320.~
    重命名为
    test2.txt.20130320 95325.~
    ,如果这是您的意思的话。
    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