2017-09-27 151 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