2017-09-27 233 views
0

我有一个类似的问题:我想批量重命名文件一样:嵌入文件路径名

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“抢只有subdirectorys名”

编辑: Python的我都做sometng像这样(对不起,如果代码不工作,但我在这里没有蟒蛇):

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) 

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

由于处理powershell成为一个耗时的问题,我把我的数据放在USB驱动器上,并在另一台Mac上使用下面的python脚本海因做的工作:(脚本也改变文件名以去除在flenames enbedded一个以前的“.C” extention)

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 
+0

你是做什么关于他们在那里的文件夹?你如何确定根源在哪里?对于一些字符串操作,这应该相当容易。你有什么尝试? – Matt

+0

我的意图是删除所有子文件夹,并保留在./文件夹/中。我在Windows的命令行上不太方便(不幸的是我不在一台可以安装python的特权机器上)我知道这是一个字符串操作的问题,但我对如何“正确” PS – DDS

+0

上的所有文件夹是否在相同的嵌套级别(即3个文件夹较深)? –

回答

0

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

## 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 
+0

谢谢,它工作! (但是我在完成了所有的东西之后尝试了这些东西,在拇指驱动器上复制数据,并在安装了python的机器上使用它们来使用它们。使用PS会耗费太多时间) – DDS

0

这应该这样做。

$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