2011-05-16 19 views
0

У меня есть несколько файлов, таких как this-переименование файлов/удаление

* .sss и * _passive.sss

Если у меня есть файл с именем blah1.sss и blah1_passive.sss, я хочу, чтобы избавиться от blah1.sss и переименовать blah1_passive.sss. Однако, если у меня нет blah1_passive.sss, я хочу зарегистрировать имя файла и сохранить blah1.sss.

Мне удалось найти все файлы * _passive.sss, но я хотел бы знать команду awk/sed etc, которая может переименовать * _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) 
+0

Попробуйте 'os.remove (newfilename); os.rename (filename, newfilename) ' – neurino

ответ

5

В Unix вы можете использовать следующую команду в оболочке Bourne (т.е. sh/bash):

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

Большое спасибо gregg – Illusionist

+0

@gregg: Это, безусловно, будет работать в * некоторых * оболочках, но определенно не в других. @illusionist: на ваш вопрос был отмечен Python, язык сценариев важен, или вы просто хотите выполнить эту работу? – Johnsyweb

+0

@ Иллиуист: Добро пожаловать. Если вы удовлетворены моим ответом, пожалуйста, отметьте его принятым :-) – Gregg

1

Этот скрипт Шоул сделать трюк:

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 работает в окнах? Я попытался запустить его с помощью sh.exe, и он сказал мне «синтаксическая ошибка возле неожиданного токена» done – Illusionist

+0

OMG, почему вы отметили unix, если хотите, чтобы он запускался в Windows? Это сценарий оболочки unix и будет работать во всех оболочках, AFAIK – neurino

+0

@Illusionist: я никогда не использовал sh.exe, но я полагаю, что он не знает, как обращаться с '<<<' _here string_ – neurino

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 
Смежные вопросы