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

У меня есть два каталога, назовем их 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>

person Michał Niedźwiedzki    schedule 08.11.2012    source источник


Ответы (2)


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

<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>
...

см. также https://stackoverflow.com/a/12847012/130683 другой пример с использованием текущего селектора

person Rebse    schedule 09.11.2012

В Ant есть задачи depend и dependset для этого.

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

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

Пример:

<depend srcdir="src" destdir="build"/>
person Petr Kozelka    schedule 08.11.2012
comment
Я думаю, что это делает противоположное тому, что я хочу. У меня нет проблем с синхронизацией СУЩЕСТВУЮЩИХ файлов. Однако мне нужно избавиться от УДАЛЕНЫХ из src/, чтобы они не оставались в build/ и не попадали в файл карты. - person Michał Niedźwiedzki; 08.11.2012