我没有编程经验,大多使用一行代码或有时更多代码来完成工作。我在批量重命名与特定模式不匹配的文件时遇到了问题。
目录中的示例文件名:
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.ics
xyz2009.pdf
ripmime
xx_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
您可以组合ls
和grep -v
:
ls | grep -v ".*textfile.*" | while read filename; do
# rename $filename to something
done
答案2
我用https://gist.github.com/995151
rename 's/\.bak$//' *.pdf