Как удалить файлы, которых нет в другом каталоге?

У меня есть два каталога, давайте назовем их src а также build, Моя система сборки работает так, что для всех файлов с более поздним mtime src чем в build он копирует файл из src в buid и делает некоторые преобразования (минификация, управление версиями и т. д.). В противном случае пропускается, поскольку файл считается актуальным.

Это, однако, создает проблему при удалении исходного файла, так как его встроенная версия все еще присутствует в build и попадает в файл карты, сгенерированный впоследствии.

$ ls src
example1.js
example2.js

$ ant do-the-stuff
...

$ ls build
example1.js
example1-12345.min.js
example2.js
example2-23456.min.js
.map

$ cat .map
example1.js=example1-12345.min.js
example2.js=example2-23456.min.js

$ rm src/example2.js
$ ant do-the-stuff
...

$ cat .map
example1.js=example1-12345.min.js
example2.js=example2-23456.min.js

Есть ли способ удалить файлы, которых нет в другом каталоге с помощью Ant? С точки зрения теории множеств это простая операция A\B.

Это то, что я уже пробовал, но не сработало:

<delete dir="build">
    <exclude name="src/*" />
</delete>

<delete dir="build">
    <exclude>
        <fileset name="src" />
    </exclude>
</delete>

<delete dir="build">
    <fileset dir="build/*">
        <not>
            <present targetdir="src" />
        </not>
    </fileset>
</delete>

2 ответа

"Есть ли способ удалить файлы, которых нет в другом каталоге с помощью Ant"
да, используйте задачу удаления с набором файлов, используя presentselector, например

<fileset dir="/home/rosebud/temp/dir1" includes="*.jar" id="srcfileset">
 <present present="srconly" targetdir="/home/rosebud/temp/dir2"/>
</fileset>
<echo>Files only in /home/rosebud/temp/dir1 => ${toString:srcfileset}</echo>
<delete>
 <fileset refid="srcfileset"/>
</delete>

удалит все файлы, присутствующие только в /home/rosebud/temp/dir1
для обратного использования:

...
 <not>
  <present present="srconly" targetdir="/home/rosebud/temp/dir2"/>
 </not>
...

см. также /questions/5927663/kak-poterpet-neudachu-na-pathelement-ne-suschestvuet-v-apache-ant/5927668#5927668 для другого примера использования текущего селектора

В Ant есть задачи depend а также dependset за это.

Они удаляют цели, для которых источники новее, но я думаю, что это может быть хорошо для вас.

В этом очень конкретном случае, depend кажется правильным.

Пример:

<depend srcdir="src" destdir="build"/>
Другие вопросы по тегам