Как копировать файлы при сохранении структуры каталогов?

Это для проекта Java, но та же концепция может быть применена более широко:

По сути, у меня есть проекты со всеми *.java файлами, расположенными в некотором подкаталоге src. Теперь я хочу собрать все каталоги с именем test в этом дереве каталогов и переместить их в новый каталог с именем tests, например:

src->com->a1
          -> A.java
          -> B.java
          -> test
              -> test1.java
              -> test2.java

в

src->com->a1
          -> A.java
          -> B.java
tests->com->a1->test
                -> test1.java
                -> test2.java

Как бы Я лучше всего это сделаю?

0
задан 14 October 2013 в 08:47

3 ответа

Обратите внимание, что значения move mv и copy cp различны и хорошо определены для использования в терминале. mv означает, что файлы больше не будут существовать в старом местоположении, в то время как cp означает, что дубликат сделан в новом местоположении.

Простое решение (обратите внимание, что я использую mv, но вы можете сначала использовать cp, а затем удалить старые файлы, как только вы захотите скопировать):

cp src/com/a1/test/test*.java tests/com/a1/test/

Более элегантно решение (это перемещает файлы, а не копии):

cd src/com/
find . -iname "test*.java" -type d -exec mv {} ../../tests/com/ \;

Если второе решение не работает для вашего конкретного теста, мы можем выполнить итерацию ...

0
ответ дан 14 October 2013 в 08:47

Вам нужно написать сценарий оболочки для этой задачи. Я попробую и прокомментирую строки.

Первая строка здесь - это просто переменная, в которую вы помещаете абсолютный каталог вашего дерева src.

SRCDIR=/dir/where/src/lives

Следующая строка выполняет find. Команда поместит каждый путь к каталогу с именем test в переменную TESTDIRS.

TESTDIRS=$(find $SRCDIR -type d -name test)

Теперь вы перебираете все найденные test каталоги

for dir in $TESTDIRS; do

. Здесь берется фактический путь и удаляется все, включая src. Итак, вы получите структуру для создания нового пути.

  NEWDIR=${dir##*/src}

Теперь создайте новые каталоги.

  mkdir -p tests/$NEWDIR

Переместите старый каталог test во вновь созданное место.

  mv $dir tests/$NEWDIR

конец итерации

done

Насколько я понимаю, это должно быть то, что вы хотите. Но, пожалуйста, сначала проверьте это. Там могут быть некоторые предупреждения и запуск сценария, как это может привести к потере данных.

0
ответ дан 14 October 2013 в 08:47

Я использую одну из этих команд, чтобы скопировать все мои файлы jpg и пропустить все файлы db, raw и т. Д. Любой из них должен работать для ваших нужд.

Используя rsync:

 rsync -a --prune-empty-dirs --include '*/' --include '*.jps' --exclude '*'  source/ target/

или find с exec:

find . -name '*.jpg' -exec cp --parents \{\} /target \;
0
ответ дан 14 October 2013 в 08:47

Другие вопросы по тегам:

Похожие вопросы: