2011-05-16 121 views
0

我喜欢这个 -文件重命名/删除

* .sss几个文件和* _passive.sss

如果我有一个文件名为blah1.sss和blah1_passive.sss,我想摆脱blah1.sss并重命名为blah1_passive.sss。但是,如果我没有blah1_passive.sss,我想记录文件名并保留blah1.sss。

我能够找到所有* _passive.sss文件,但我想知道可以将* _passive.sss重命名为* .sss的awk/sed etc命令。

编辑:现在我有这个,但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) 
+0

尝试'os.remove(newfilename); os.rename(filename,newfilename)' – neurino 2011-05-16 22:15:53

回答

5

在Unix中,你可以在Bourne shell(即sh/bash)使用以下命令:

for f in *_passive.sss; do mv -v $f `basename $f _passive.sss`.sss; done 
+0

非常感谢gregg – Illusionist 2011-05-16 21:47:05

+0

@gregg:这肯定会在* some * shell中起作用,但绝对不会在其他版本中起作用。 @illusionist:你的问题被标记为Python,是脚本语言的重要部分,还是你只是想完成这项工作? – Johnsyweb 2011-05-16 22:03:00

+0

@迷惑者:不客气。如果你对我的回答满意,请将它标记为:-) – Gregg 2011-05-16 22:03:36

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

+0

谢谢,willthis在Windows中工作?我试着用sh.exe运行它,它告诉我“在意外标记附近出现语法错误”完成“ – Illusionist 2011-05-16 22:02:57

+0

OMG为什么如果你希望它在Windows上运行,则标记为unix?这是一个unix shell脚本,可以在所有shell中运行,AFAIK – neurino 2011-05-16 22:07:34

+0

@Illusionist:我从来没有使用sh.exe,但我想他不知道如何处理一个'<<<'_here string_ – neurino 2011-05-16 22:13:17

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 
相关问题