Это для проекта 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
Как бы Я лучше всего это сделаю?
Обратите внимание, что значения 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/ \;
Если второе решение не работает для вашего конкретного теста, мы можем выполнить итерацию ...
Вам нужно написать сценарий оболочки для этой задачи. Я попробую и прокомментирую строки.
Первая строка здесь - это просто переменная, в которую вы помещаете абсолютный каталог вашего дерева 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
Насколько я понимаю, это должно быть то, что вы хотите. Но, пожалуйста, сначала проверьте это. Там могут быть некоторые предупреждения и запуск сценария, как это может привести к потере данных.
Я использую одну из этих команд, чтобы скопировать все мои файлы jpg и пропустить все файлы db, raw и т. Д. Любой из них должен работать для ваших нужд.
Используя rsync
:
rsync -a --prune-empty-dirs --include '*/' --include '*.jps' --exclude '*' source/ target/
или find
с exec
:
find . -name '*.jpg' -exec cp --parents \{\} /target \;