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脚本或类似的脚本也可以完成这项工作。

4

2 回答 2

0

我个人不了解 ANT,所以我会在 bash 中试一试。

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

这将遍历文件夹并为文件夹中的每个文件增加一个计数器。当我们进入下一个文件夹时,计数器被重置。

我创建了一个像你这样的测试目录结构,它对我有用。

于 2012-09-20T12:06:54.873 回答
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

在一些测试目录上进行了测试,它工作正常。

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

于 2012-09-20T12:11:07.430 回答