2012-09-20 211 views
0

我有幾個需要與「預期」輸出文件夾進行比較的程序輸出。但我的問題是輸出文件總是有不同的文件名。將文件重命名爲基於其他目錄的目錄

如何將一個文件夾中的所有文件重命名爲另一個文件夾中的相同文件名。下面的例子 - 預期的文件結構(當然改變的也可以):

expected/folder1/file1.txt 
expected/folder1/file2.txt 
expected/folder2/file1.txt 
expected/folder3/file1.txt 

而且我的輸出看起來是這樣的(大量的文件和位置總是等於):

result/folder1/fileOtherName1.txt 
result/folder1/fileOtherName2.txt 
result/folder2/fileOtherName1.txt 
result/folder3/fileOtherName1.txt 

我嘗試使用ANT (因爲我知道),但被卡住了,因爲我無法通過索引選擇文件(按字母順序排序)。

這裏我在ANT僞代碼(但不知道如何繼續):

<target name="foo"> 
    <foreach> 
     <fileset dir="result" casesensitive="yes"> 
      <include name="**/*.txt"/> 
     </fileset> 
     <antcall target="rename"> 
     </antcall> 
    </foreach> 
</target> 

<target name="rename"> 
    <!-- how can I access another fileset and take the correct file? --> 
    <!-- Here I got stuck --> 
    <echo message="foreach.file is ${foreach.file}" /> 
    <echo message="foreach.dir is ${foreach.dir}" /> 
    <echo message="foreach.name.ext is ${foreach.name.ext}" /> 
    <echo message="foreach.name is ${foreach.name}" /> 
</target> 

感謝您的幫助,它不能在ANT唯 - 一個BASH腳本或類似的能也做這項工作。

+0

你怎麼知道哪個結果文件名應該匹配哪個文件名?你只是刪除一個固定的部分?我還有其他一些東西嗎? –

+0

這取決於每個文件夾中文件的字母順序。所以「fileOtherName1」應該重命名爲file1等等。結果中的第一個文件在預期中重命名爲第一個文件名。 – FiveO

回答

0

如何

#!/bin/bash 

IN_DIR="expected/folder1" 
OUT_DIR="result/folder2" 

IN_FILES=($IN_DIR/*) 
OUT_FILES=($OUT_DIR/*) 

for ((i=0; i<${#IN_FILES[@]}; i++)); do 
    mv ${OUT_FILES[i]} $OUT_DIR/$(basename ${IN_FILES[i]}) 
done 

測試了一些測試顯示目錄​​,和它的作品確定。

請注意,如果您的任何文件名包含空格,則不起作用。

+0

謝謝 - 這很好用! – FiveO

0

我個人不知道螞蟻,所以我會在bash中給它一個鏡頭。

for i in *; do 
    k=1; 
    for j in $i/*; do 
    mv "$j" $i/file$k.txt; 
    k=$[$k+1]; 
    done; 
done 

這將遍歷文件夾併爲文件夾中的每個文件遞增計數器。當我們進入下一個文件夾時,計數器被重置。

我創建了一個像你的測試目錄結構,它爲我工作。