LinuxForum.Fans
Тема

Cp: сложное копирование файлов

Автор: teseii 21 сообщений 11791 просмотров
#190337

есть каталог со сложной структурой вложенных папок, необходимо скопировать все в одну папку, все файлы и каталоги должны быть в корне этой папки. Подскажите пож-ста синтаксис команды cp.

#190338

т.е. cp -vR /dir/* /dir2/ не катит уже?

#190344

В крайнем случае всегда есть mc :cool:

#190349

спасибо за совет, но вот выполняю:
cp -vR ./* ~/share2/books/
а копируется все с папками, как и в исходном каталоге :(

#190350

teseii, ну все правильно, * - это копировать все включая каталоги, так как есть. А так вам надо сделать листинг, а потом парсить, что копировать и куда =)

#190351

find на пару с cp способны произвести нужный эффект.

#190353

i2ks, звучит довольно-таки сложно, нельзя ли одной командой сделать? mc поставил, как его использовать для сабжа - не понял.

#190357
teseii написал:
mc поставил, как его использовать для сабжа - не понял.

Хм. Странно вообще. Пометь файлы которые нужно скопировать и нажми F5 [Copy]
Или я чего-то не понимаю или вы не можете реально описать задачу.

teseii написал:
а копируется все с папками, как и в исходном каталоге

как бы в задаче было:

teseii написал:
необходимо скопировать все в одну папку, все файлы и каталоги должны быть в корне этой папки.

Вроде нужный результат уже был достигнут. oO

#190358

могу и ошибаться, но вот:
find /dir1/ -type f -exec cp -P "{}" /dir2/ ";"

#190360

Еще раз о задаче: есть over 9000 файлов, рассованых по over 9000 каталогов, уровень вложенности - 5. Нужно скопировать все файлы в одну папку. Можно копировать и в мс, но сломаются пальцы и глаза. Могу написать программу, но зачем изобретать велосипед?

попробовал по совету bormant объединить find и cp, получился такой монстр:
find ./ -name *.zip -type f -print | xargs cp ./
на что мне пишет:
cp: указанная цель «Мага.fb2.zip» не является каталогом

#190362

урррррррррряяя, заработало!

find ./ -name *.zip -type f -exec cp -P "{}" ./ ";"

всем спасибо, i2ks - в особенности! ;)

#190363
teseii написал:
всем спасибо, i2ks -  в особенности!

ну это ты bormant, скажи спасибо, он подсказал =)

#190366

всем участникам - в любом случае :)

#190369

Ну, и на случай Zip, ZIP и сотоварищи, предпочтительнее
... -iname *.zip ...

Если не только zip, но все подряд, можно этот предикат совсем убрать...

#190742

есть ещё задачка по теме:

нужно скопировать из поддиректории в заданную все директории, максимальная глубина вложенности которых 2

наброски..
1. find . -type d -print | sort # видно общую картину

# например, такую:
./1
./1/11
./2
./2/22
./3
./3/33
./3/33/333
./4
./4/44
./4/44/444
./4/44/444/4444

# по идее, нужны только ./1 и ./2 рекурсивно
# но когда копирование..

2. find . -maxdepth 2 -type d -exec cp -pR {} /target/dir \;

# тянутся все директории, т.е. ./1/11 ./2/22 ./3/33/333 ./4/44/444/4444
# что и не удивительно, но как же выбрать нужные, а ещё исключить все файлы на путях, т.е. скопировать только структуру подкаталогов ?

3. find . -mindepth 2 -maxdepth 2 -type d -print | sort

./1/11
./2/22
./3/33
./4/44

# ...

кстати, вот тут что-то промелькнуло по поводу «Копирование сложного дерева каталогов» (Листинг 5) , но я не врубился почему cpio, да и cpio: cannot open /target/dir: is a directory.

может кто подскажет простое и красивое решение... ??

#190743

Не то чтобы скопировать, но структуру каталогов создаст
find . -maxdepth 2 -type d -exec mkdir /target/dir/'{}' \;

#190924

небольшое уточнение: для mkdir тут нужен параметр -p #make parentdirectory as needed, т.е.

find . -maxdepth 2 -type d -exec mkdir -p /target/dir/'{}' \;

и если нам нужно только те, где два вложения, а не одно или больше двух, то

find . -maxdepth 2 -mindepth 2 -type d -exec mkdir -p /target/dir/'{}' \;

# ещё бы отсеять не подходящее условию... :rolleyes:

#190940

ojO,
докажете примером необходимость '-p' -- соглашусь.
Докажете?

#190946

bormant, smile

конкретно здесь:
find . -maxdepth 2 -type d -exec mkdir -p /target/dir/'{}' \;
скрипт отрабатывает нармулЪ и без '-p', только одно предупреждение от mkdir
mkdir: cannot create directory `/target/dir/.': File exists;
из-за того, что find передаёт '.', соответственно в случае (без '-p'):
find . -maxdepth 2 -mindepth 2 -type d -exec mkdir /target/dir/'{}' \;
получаем сплошное ругательство
mkdir: cannot create directory `/target/dir/./../..': No such file or directory;

поэтому я и предложил '-p' #no errors if existing, make parent directory as needed smile
ну соглашайтесь ужжже :rolleyes:

кстати, find . -maxdepth 2 -mindepth 2 -type d | cipo -pdumv /target/dir/
корректно отрабатывает, сохраняя все права и идентификаторы

а условие задачки, все-таки, ещё не выполнено полностью... :o

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