代码之家  ›  专栏  ›  技术社区  ›  DDS

嵌入文件路径到名称

  •  0
  • DDS  · 技术社区  · 8 年前

    我有一个类似的问题:我想批量重命名文件,如:

    c:>/folder/path_a/to/my_first_file.txt
    c:>/folder/path_b/to/my_2_nd_file.txt
    c:>/folder/path_c/to/my_bla_bla.txt
    c:>/folder/path_d/to/pippo.txt
    c:>/folder/path_d/to/pluto.txt
    c:>/folder/path_d/to/my_bla_bla.txt
    

    我会将它们重命名为:

    c:>/folder/path_a-to_my_first_file.txt
    c:>/folder/path_b-to-my_2_nd_file.txt
    c:>/folder/path_c-to-my_bla_bla.txt
    c:>/folder/path_d-to-pippo.txt
    c:>/folder/path_d-to-pluto.txt
    c:>/folder/path_d-to-my_bla_bla.txt
    

    文件名路径的“嵌入”部分

    有人能帮我吗(我在用Windows)?

    建立 this 但我不知道如何告诉PS“只抓取子目录名”

    编辑: 在python上,我会这样做(如果代码不起作用,很抱歉,但在这里我没有python):

    for dirname, _, fnames in os.walk('.'):
        first=dirname.replace('\','-')
        for fname in fnames:
            name="{}-{}".format(first,fname)
            os.rename("{}\{}".format(dirname,fname),"{}"name)
    
    for for dirname,_,fname in os.walk('.'):
        os.remove(dirname)
    

    =============更新===================

    from os import rename, walk, chdir
    EXT = '.c'
    PATH = 'folder'    
    
    chdir(PATH)
    for cart, _, files in walk("."):
            for i in files:
                    if os.path.isfile("{}/{}".format(cart,i)):
                            if EXT in i:
                                    nn = i.replace(EXT,'') #removes inner extension
                                    rename('{}/{}'.format(cart,i),'{}-{}'.format(cart,nn)) #changes the path
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   user6811411 user6811411    8 年前

    展平/折叠目录树不仅仅是重命名,而是移动文件,然后删除(空)目录。

    ## Q:\Test\2017\09\27\SO_46452350.ps1
    $Base = 'C:\folder\'
    Set-Location $Base
    Get-ChildItem -Dir | ForEach-Object {
        Get-ChildItem -Path $_ -File -Recurse |
            Move-Item -Destination {Join-Path $Base ($_.FullName.Replace($Base,'').Replace('\','_'))} 
        $_ | Remove-Item -Recurse
    }
    

    样本树:

    > tree /F
    C:.
    └───folder
        ├───path_a
        │   └───to
        │           my_first_file.txt
        │
        ├───path_b
        │   └───to
        │           my_2_nd_file.txt
        │
        ├───path_c
        │   └───to
        │           my_bla_bla.txt
        │
        └───path_d
            └───to
                    my_bla_bla.txt
                    pippo.txt
                    pluto.txt
    

    运行脚本后:

    > tree /F
    C:.
    │
    └───folder
            path_a_to_my_first_file.txt
            path_b_to_my_2_nd_file.txt
            path_c_to_my_bla_bla.txt
            path_d_to_my_bla_bla.txt
            path_d_to_pippo.txt
            path_d_to_pluto.txt
    
        2
  •  0
  •   ChiliYago    8 年前

    这应该可以做到。

       $root = "c:>/folder/"
       $paths = "c:>/folder/path_a/to/my_first_file.txt",`
        "c:>/folder/path_b/to/my_2_nd_file.txt",`
        "c:>/folder/path_c/to/my_bla_bla.txt",`
        "c:>/folder/path_d/to/pippo.txt",`
        "c:>/folder/path_d/to/pluto.txt",`
        "c:>/folder/path_d/to/my_bla_bla.txt"
    
        function update-paths
        {
    
            params(
                string[] $paths
            )
    
    
            $paths | foreach {
    
                $path = $_.substring($root.Length,$_.Length-$root.Length)
    
    
                Write-Output ($root + ($path.replace("/","-")))
    
            }
    
        }
    
        update-paths -paths $paths
    
    c:>/folder/path_a-to-my_first_file.txt
    c:>/folder/path_b-to-my_2_nd_file.txt
    c:>/folder/path_c-to-my_bla_bla.txt
    c:>/folder/path_d-to-pippo.txt
    c:>/folder/path_d-to-pluto.txt
    c:>/folder/path_d-to-my_bla_bla.txt
    
    推荐文章