【问题标题】:Rename file names with folder names (maybe use Python)用文件夹名称重命名文件名(可能使用 Python)
【发布时间】:2015-04-17 09:45:46
【问题描述】:

我有一个父文件夹,其中包含多个文件夹。然后,这些嵌套文件夹中的每一个都包含 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

谢谢。

【问题讨论】:

    标签: batch-file filenames rename


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您几乎可以使用任何编程语言(可能包括 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 的 Learn Python The Hard Way 和 Mark Pilgrim 的 Dive Into Python

      【讨论】:

        【解决方案3】:

        对于批处理文件解决方案

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

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

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

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

        已编辑 答案并不完全正确。虽然只使用一个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)

        【讨论】:

        • +1,但如果文件夹名称包含扩展名,这将不起作用。使用ren "%%~fa\*" "%%~na.*" 可能更安全
        • @dbenham,最后,没有。我可以删除扩展名,但如果文件夹名称包含一个点,它将成为重命名命令的新扩展名,并且代码也会失败。我喜欢代码的简洁性,但它并不安全。
        • 如果有人也需要第一个子目录的批处理行,我将上面的内容调整为:for /d %%a in ("C:\...\*") do for /d %%c in ("%%~fa\*") do for %%b in ("%%~fc\*") do ren "%%~fb" "%%~nxa%%~xb"
        【解决方案4】:

        这只能通过批处理来完成,我发布这个脚本只是为了演示这在 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
        

        【讨论】:

          【解决方案5】:

          一个简单的 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 它将do 重命名ren%a\%b 与它包含在%a 中的文件夹的名称保持相同的扩展名%~xb

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-10-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多