-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 命令将“'”解释为 find-command 的结尾,将“-”解释为路径中的选项符号“./Beginners Tools/你好-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 回答