LinuxForum.Fans
Тема

Исключить из копирования несколько директорий.

Автор: Rassol2 9 сообщений 1804 просмотров
#379712

Здравствуйте.
Нужно написать строку что бы копировать все содержимое с директории и поддиректории. Кроме 3 директорий.
Я пока что придумал связку find + cp но что то пока что не получается.

text
find /home/rassol2/Документы/test/1/ -path \(rassol2\|TCA.Maps\|TCA.Mods\|TCA.Updates\) -exec cp {} /home/rassol2/Документы/test/2/ \;

Подскажите как быть ?

#379713
"Rassol2" написал:
Подскажите как быть ?

Я бы попробовал rsync с опцией --exclude.

#379714
"Rassol2" написал:
Я пока что придумал связку find + cp но что то пока что не получается.
text
find /home/rassol2/Документы/test/1/ -path \(rassol2\|TCA.Maps\|TCA.Mods\|TCA.Updates\) -exec cp {} /home/rassol2/Документы/test/2/ \;

Наверное, правильнее так:

text
find /home/rassol2/Документы/test/1/ -path \(rassol2\|TCA.Maps\|TCA.Mods\|TCA.Updates\) -exec cp -r -t /home/rassol2/Документы/test/2/ {} \;
#379719

Rassol2, Lupo Alberto, с какого перепуга у вас регулярные выражения в -path?!

Либо юзайте find ! -regex "RE"

Либо каждый каталог прописывайте отдельно.

[console]find ! \( -path "./.dir1/*" -o -path "./.dir/*" \) -print[/console]

#379807

пришел к решению использовать rsync
Моя строка

text
rsync -alv -x --exclude=TCA* /home/rassol2/test/1/ /home/rassol2/test/2/

Решает все проблемы.
Последнее время смотрю что rsync заменяет cp :)

#379808
drBatty написал:
Rassol2, Lupo Alberto, с какого перепуга у вас регулярные выражения в -path?!

Либо юзайте find ! -regex "RE"

Либо каждый каталог прописывайте отдельно.

[console]find ! \( -path "./.dir1/*" -o -path "./.dir/*" \) -print[/console]

Как то сложновато, уделил 2 часа на понимание плюнул, в силу своей слабохарактерности.

#379831
"Rassol2" написал:
Последнее время смотрю что rsync заменяет cp
дык unix-way жеж: каждая утилита должна делать одну задачу, и делать хорошо.

cp хорошо копирует.

find хорошо ищет

тебе хочется синхронизации. Два варианта: либо слепить конвейер-велосипед find|cp, либо решать задачу специальным инструментом rsync. Разве не очевидно, какой способ лучше?

"Rassol2" написал:
Как то сложновато, уделил 2 часа на понимание плюнул, в силу своей слабохарактерности.

find нужна для поиска по условию
Условие может быть любой сложности
Обычно условие связывается союзом «И»(«AND», в find «-a»)
Ты хочешь ИЛИ. И потому тебе нужно во первых прописать ИЛИ явно: «-o», и во вторых использовать скобки, т.к. ИЛИ это "сложение", а оно младше "умножения" И. Да, вся команда внутри bash'а работает, а bash скобки понимает по своему. Потому надо писать «\(» «\)».

Условие «-path "шаблон"» работает как «-name "шаблон"», но в отличие от последнего использует весь путь, а не только имя файла. Каталоги тоже учитываются.

ЗЫЖ конечно самодельный велосипед всё равно хуже танка.

#379859

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

#379891

Rassol2, cp может копировать только то, что ты ей указал. Т.е. если тебе надо скопировать файлы 1.jpg, 2.jpg, 3.jpg, то тебе их надо ЯВНО указать все. А если ты запишшешь *.jpg, то за тебя это сделает bash. Потому в cp и нет ключа exclude. Не нужен он ей. Зачем что-то исключать, если можно не указывать?

Потому и приходится сначала искать, а потом копировать. И лучше это делать специальной утилитой, а не велосипедом самосборным.

Войдите или зарегистрируйтесь, чтобы ответить.