-1

この質問は、ファイルの名前を再帰的に変更することに関する回答に関連しています。

ダッシュを置き換えるように変更されたコードは、次のような場合には機能しません。

./Beginners Tools/Hello's -Trojans-/bif43243
./Linux/Nux Col - 1 Works (TEX & Pdf) - T'eouhsoe & More (33323 - 34432)
./Git/peepcode-git-mov/c6_branch_merge.mov
./haskell/OS 2007 - T aoue
./B Sites for Get-Big

次のような場合に機能しました。

./oeu'oeu - X ee ls - Feb 2008.pdf

したがって、データを解析する必要があります。ダッシュを正しく置き換えるにはどうすればよいですか?

[詳細]

コードはリンクからのものですが、「-」を置き換えるように変更されています。

import os
for dirpath, dirs, files in os.walk(your_path):
    for filename in files:
        if '&' in filename:
            os.rename(
                os.path.join(dirpath, filename),
                os.path.join(dirpath, filename.replace('-', '_'))
            )

Python はすべてのダッシュを置き換えませんでした。名前には、以前にスクリプトを停止した特殊な記号が含まれているためだと思います。そのため、アーカイブ中にエラーが発生しました:

tar cvzf sed_backup.tar.gz `find documents | sed  s/\.*/\'\&\'/`
tar: rojans-: Cannot stat: No such file or directory
tar: Error is not recoverable: exiting now

名前に「 ' 」と「 - 」の記号がまだ残っているため、tar-command は「 ' 」を find-command の末尾として解釈し、「 - 」をパス内のオプション記号として解釈します ./Beginners Tools/ Hello's -Trojans-/bif43243"

4

3 に答える 3

2

os.path.walk は、ファイル システム ツリーをたどるのに便利です。簡単な例を次に示します。

import os, shutil

def rename_file(arg, dirname, filename):
   filepath = os.path.join(dirname, filename)
    # check if file meets your rename condition here
    if os.path.isfile(filepath):
       new_name = "something"
       shutil.move(filepath, os.path.join(dirname, new_name)

os.path.walk(base_dir, rename_file, None)

よろしくアーサー

于 2009-11-08T16:15:04.013 に答える
1

おそらく問題は、一重引用符、括弧、およびダッシュです。それらをエスケープするか、置き換えることができます。

実際に編集を見ると、リンク先の元のコードは、パス全体ではなくファイル名の文字を置き換えています。パス内の文字をエスケープする必要があります。

esc_dirpath = dirpath.replace('-','\-')

これはかなり単純化したもので、正規表現を使用して一連の文字をエスケープすることもできます。

実際に名前を変更する前に、その os walk を実行して、これらの文字のエスケープ/置換の前後に特殊なケースを出力することをお勧めします。

于 2009-11-08T16:53:09.477 に答える
0

この投稿が役立つかもしれません:ファイル名と内容の文字列を再帰的に置き換えるpythonスクリプト

于 2011-10-04T19:07:09.740 に答える