批量重命名不匹配模式的文件

批量重命名不匹配模式的文件

我没有编程经验,大多使用一行代码或有时更多代码来完成工作。我在批量重命名与特定模式不匹配的文件时遇到了问题。

目录中的示例文件名:

Meeting_Packages.pdf
13_textfile0
19_textfile0
23_textfile0
29_textfile0
33_textfile1
45_textfile0
5_textfile3
Membership.pdf
13_textfile1
19_textfile1
23_textfile1
29_textfile1
34_textfile0
46_textfile0
6_textfile0
xyz2009.pdf
13_textfile2
19_textfile2
23_textfile2
29_textfile2
34_textfile1
47_textfile0
6_textfile1
meeting.ics

我想将文件(例如、和)重命名Meeting_Packages.pdf为它们Membership.pdf的来源文件(输入文件)。实际上,它是邮件的输出,其他的是附件。我想将附件命名为原始输入文件meeting.icsxyz2009.pdfripmimexx_textfilex

我的代码:

#!/bin/bash

FILES=*.mime
for f in $FILES
do
    echo "Processing $f"
    #rip mails into attachments and text files also add a prefix to text files
    ripmime -i $f -d ~/test/ripmime --prefix 
    #Remove white spaces from files 
    rename 's/ /_/g' ~/test/ripmime/*
    #rename attachments as original input files
    rename 's/\[^0-9]/'$f/ ~/test/ripmime/* 
done

我的问题是最后一行重命名,我尝试过滤除xx_textfilex重命名之外的文件。我尝试了不同的正则表达式,但无法做到这一点。我可以通过以下方式选择和重命名文本文件:

rename 's/textfiles/'$f/ ~/test/ripmime/*

但我需要相反的操作并重命名文本文件以外的文件。

我怎样才能做到这一点?

答案1

您可以组合lsgrep -v

ls | grep -v ".*textfile.*" | while read filename; do
  # rename $filename to something
done

答案2

我用https://gist.github.com/995151

rename 's/\.bak$//' *.pdf

相关内容