文件重命名/删除
我有一些这样的文件:
*.sss 和 *_passive.sss
比如说,如果我有一个叫做 blah1.sss 的文件和一个叫做 blah1_passive.sss 的文件,我想删除 blah1.sss,并把 blah1_passive.sss 重命名为 blah1.sss。不过,如果我没有 blah1_passive.sss 这个文件,我就想记录下这个文件名,并保留 blah1.sss。
我已经找到了所有的 *_passive.sss 文件,但我想知道用 awk 或 sed 等命令怎么把 *_passive.sss 重命名为 *.sss。
补充:现在我有这个代码,但 os.rename 不会覆盖文件,我需要它能覆盖。
import os, fnmatch
def locate(pattern, root=os.curdir):
#ignore directories- uncomment to make ignore work
#ignored = ["0201", "0306"]
for path, dirs, files in os.walk(os.path.abspath(root)):
#for dir in ignored: # if dir in dirs: #dirs.remove(dir)
for filename in fnmatch.filter(files, pattern):
yield os.path.join(path, filename)
for filename in locate("*_passive.sss"):
#found the files that i want to rename, but os.rename() refuses to overwrite !!
newfilename=filename.rstrip("_passive.sss") + ".sss"
os.rename(filename,newfilename)
3 个回答
1
这里有一个用Python写的解决方案:
import os
from glob import glob
# Write out test files.
with open('foo.sss', 'w'): pass
with open('foo_passive.sss', 'w'): pass
with open('bar.sss', 'w'): pass
# Rename files.
files = glob('*.sss')
for filename in files:
if filename.endswith('_passive.sss'): continue
passive_fname = filename.split('.sss')[0] + '_passive.sss'
if passive_fname in files:
os.remove(filename)
os.rename(passive_fname, filename)
else:
print 'no passive: ', filename
1
这个 shell 脚本应该能解决问题:
while read f; do
fp="`echo "$f" | sed -nr 's|(.*)(\.sss)|\1_passive\2| p'`"
if [ -f "$fp" ]; then mv "$fp" "$f"
else echo "file $fp missing" >> missing.log
fi
done<<<"`ls -1 *.sss | grep -v _passive.sss`"
它还会把缺少的 _passive
文件记录到 missing.log
里。
5
在Unix系统中,你可以在Bourne shell(也就是sh
或bash
)中使用以下命令:
for f in *_passive.sss; do mv -v $f `basename $f _passive.sss`.sss; done