使用文件夹名称重命名文件名(可能使用Python)

时间:2015-02-16 19:28:50

标签: batch-file filenames rename

我有一个包含多个文件夹的父文件夹。然后,这些嵌套文件夹中的每一个都包含4个文件,这些文件构成了GIS shapefile并具有不同的扩展名(即“.dbf”,“。prj”,“。shp”和。“shx”)。我不熟悉编码(在R之外)并且不知道这是否可以通过Python自动化,或者我是否需要运行shell脚本(我正在使用Windows)。我有非常基本的编码学校,所以文档很棒(和/或“虚拟”网站的建议阅读)。

以下是当前文件结构的示例(显示我要使用子文件夹名称重命名的四个文件):

Parent Folder:  "Raptors"
   Subfolder:  "Falco_peregrinus"
       File 1:  "ra03310.dbf"
       File 2:  "ra03310.prj"
       File 3:  "ra03310.shp"
       File 4:  "ra03310.shx"

以下是我想要重命名的四个文件:

File 1:  Falco_peregrinus.dbf
File 2:  Falco_peregrinus.prj
File 3:  Falco_peregrinus.shp
File 4:  Falco_peregrinus.shx

感谢。

5 个答案:

答案 0 :(得分:1)

您几乎可以使用任何编程语言(可能包括R)来执行此操作。 Python在这里是一个很好的选择,因为它具有如此友好的语法。

解决问题的极其简单的脚本可能如下所示

import os
import os.path
'''
Given a file name, returns a pair with the name and extension (hello.txt => [hello,txt])
'''
def split_name(file_name):
    return file_name.rsplit('.',1)

'''
Recursively renames files in subdirectories of base_directory so each file is named the subdirectory name plus the extension
WARNING! You will be very sad if you have multiple files with the same extension in any of those folders
def rename_file(base_directory):

    #Get the folder name for base_directory (c:\users\foobar => foobar)
    directory_name = os.basename(base_directory)
    #List the files in base_directory
    for path in os.listdir(base_directory):
        old_name = base_directory + '/' + path
        #If the path points to a file, rename it directory name + '.' + extension
        if os.path.isfile(old_name):
           new_name = base_directory + '/' + directory_name + '.' + split_name(path)[1]
           if not os.path.exists(new_name):
                os.rename(old_name,new_name)
           else:
                print("ERROR:"+new_name+" exists")

        else:
           #If it's a subfolder, recursively call rename files on that directory.
           rename_files(old_name)

另外,我强烈建议由Zed Shaw学习Python的艰难之路并由Mark Pilgrim潜入Python

答案 1 :(得分:1)

对于批处理文件解决方案

@echo off
    for /d %%a in ("c:\...\Raptors\*") do ren "%%~fa\*.*" "%%~na.*"

对于父文件夹中的每个文件夹,将文件夹中的所有文件重命名为文件夹的名称,但保留扩展名

for命令用于迭代父文件夹下的文件夹列表(/d)。对于每个文件夹,可替换参数%%a将保存对子文件夹的引用,并为每个文件夹执行do子句中的代码。

do子句中的代码执行ren命令,对于子文件夹下的所有文件(%%~fa是正在使用完整路径处理的文件夹),将其名称更改为文件夹的名称(%%~na)。

已编辑答案并不完全正确。虽然只使用一个ren命令重命名每个文件夹下的所有文件的基本思路可能是最快的方法,但如果文件夹名称包含点,则the way ren command handles wildcards会使此代码失败。为了确保代码不会失败,有必要迭代文件,重命名每个文件

for /d %%a in ("c:\...\Raptors\*") do for %%b in ("%%~fa\*") do ren "%%~fb" "%%~nxa%%~xb"

对于每个文件夹(%%a),对于文件夹(%%b)内的每个文件,将文件重命名为完整文件夹名称(%%~nxa)的名称,扩展名为档案(%%~xb

答案 2 :(得分:0)

一个简单的Windows命令可以解决您的问题。阅读HELP FOR并在Windows命令行中尝试:

for /d %a in (*) do @for %b in (%a\*) do @ren %a\%b %a%~xb

让我们分析一下

第一个for将遍历所有(*)目录/d,并且对于每个找到的内容,在%a中传递,第二个for将遍历所有它包含(%a\*)的文件,对于找到的每个文件%b,它doren %a\%b重命名为%a,并将其%~xb中包含的文件夹的名称重命名为{{1}}保持{{1}}的相同扩展名。

答案 3 :(得分:0)

这可以仅使用批处理完成,我发布此脚本只是为了演示它在Ruby中的容易程度

# enumerate all subfolders of raptors
Dir.glob("raptors/**/*/") do |folder|
  # remember the prefix
  pre = File.basename(folder)[/.+_/]
  # enumerate all files under this folder
  Dir.glob("#{folder}*.*") do |file|
    File.rename(file,  "#{File.dirname(file)}/#{pre}#{File.basename(file)}")
  end
end

答案 4 :(得分:0)

python代码还有另一个答案,该代码很好地根据文件夹名称更改了我的GIS文件名: Thanks @Martin Evans