Как я могу нерекурсивно перенести каталоги с помощью Perl или оболочки?

Мы переносим домашние папки в новую файловую систему, и я ищу способ автоматизировать это с помощью Perl или сценария оболочки. У меня нет большого выбора языков программирования, поскольку системы представляют собой проприетарные кластеры хранения, которые должны оставаться как можно более неизменными.

Задача: В каталоге /home/ у меня есть домашние папки различных пользователей aaa, bbb, ccc, ..., и у них есть определенные разрешения и права пользователя/группы, которые должны оставаться нетронутыми при переходе в /newhome/. Вот пример того, что нужно перенести из /home:

drwxr-xr-x    3 aaaaa    xxxxxxxxx   4096 Feb 26  2008 aaaaa/
drwxrwxrwx   88 bbbbbbb  yyyyyy      8192 Dec 16 16:32 bbbbbbb/
drwxr-xr-x    6 ccccc    yyyyyy      4096 Nov 24 04:38 ccccc/
drwxr-xrwx   36 dddddd   yyyyyy      4096 Jun 20  2008 dddddd/
drwxr-xr-x   27 eee      yyyyyy      4096 Dec 16 02:56 eee/

Таким образом, точно такие же папки с разрешениями и владельцами должны быть созданы в /newhome. Копирование/перемещение файлов не должно вызывать беспокойства, так как это будет сделано позже.

Кто-нибудь работал над таким скриптом? Я действительно новичок в Perl, поэтому мне нужна помощь.


person DV.    schedule 22.12.2008    source источник


Ответы (4)


Флаг cp's -a будет поддерживать разрешение, время модификации и т. д. Вы должны иметь возможность сделать что-то вроде:

for a in `ls /home`; do cp -a "/home/$a" "/newhome/$a" ; done

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

РЕДАКТИРОВАТЬ: вы можете отключить рекурсивное копирование файлов с помощью rsync или tar, как упоминал Пол. При использовании rsync подкаталоги сохраняются, но файлы не копируются:

sudo rsync -pgodt /home/ /newhome/

Я не пробовал tar --no-recursion, поэтому не могу комментировать.

РЕДАКТИРОВАТЬ 2: Другой способ

find /home/ -maxdepth 1 -print | sudo cpio -pamVd /newhome

Справочник

person codelogic    schedule 22.12.2008
comment
Отличный 1-лайнер, спасибо! Есть ли способ запретить cp копировать подпапки и файлы каждого пользовательского каталога? Другими словами, создайте только самые популярные каталоги пользователей в /home без копирования содержимого. - person DV.; 23.12.2008
comment
@DV: На странице руководства указано, что cp -a эквивалентно cp -dpr ... поскольку -r обрабатывает рекурсию, cp -dp должен делать то, что вы хотите, без рекурсии. - person Adam Bellaire; 23.12.2008
comment
Адам, cp опускает каталоги, если -r не указан, поэтому -dp будет применяться только к файлам, насколько я знаю. - person codelogic; 23.12.2008
comment
codelogic прав, я не могу заставить его работать как 'cp -dp' :( Кажется, нет никакого способа заставить cp копировать только верхние папки ниже /home без копирования всего их содержимого... :/ - person DV.; 23.12.2008
comment
@codelogic: Попался, я не знал, что DV хотел создать каталоги верхнего уровня и оставить их пустыми. Виноват. - person Adam Bellaire; 23.12.2008
comment
Святое дерьмо, сила знания правильных команд. Большое спасибо, codelogic! Ваше последнее редактирование работает отлично! - person DV.; 23.12.2008
comment
-print не нужен, поэтому его можно опустить или, что еще лучше, заменить на -print0. - person jfs; 23.12.2008
comment
Итак, моя первая часть команды: find /home -maxdepth 1 -type d, а затем я передаю вывод в cpio. - person DV.; 23.12.2008

Вы можете сохранить владельца и группу только в том случае, если выполните операцию копирования как root. Большинство приведенных команд будут работать — будут работать опции tar и cp -rp.

Единственная уловка, о которой стоит беспокоиться, — это каталоги, недоступные для записи, но это проблема для пользователей без полномочий root. Затем я обычно использую:

(cd /home; find . -depth) | cpio -pvdumB /newhome

Параметр -depth означает, что файлы и подкаталоги обрабатываются перед самими каталогами, поэтому разрешение на запись в каталоге устанавливается только после того, как все содержимое каталога будет скопировано в него. Вы также можете использовать 'sort -r' для перечисления файлов в обратном порядке, что гарантирует, что каталоги будут отображаться после их содержимого.

person Jonathan Leffler    schedule 22.12.2008

Это создаст каталоги и скопирует все файлы.

cd /home; tar cvBf - . | (cd /newhome; tar xvpBf -)

Если вы не хотите копировать все файлы, вы можете сделать это, добавив «--no-recursion» к первой команде tar.

person Paul Tomblin    schedule 22.12.2008
comment
Я попробую это. Я не ищу рекурсии, спасибо за совет! - person DV.; 23.12.2008
comment
К сожалению, когда я пробовал, он не копировал разрешения/права собственности. Может я что-то не так делал. - person DV.; 23.12.2008
comment
@DV: добавьте sudo перед tar. - person jfs; 23.12.2008
comment
@DV - или сделайте это как root. Убедитесь, что вы включили этот p во второй tar, который копирует разрешения. - person Paul Tomblin; 23.12.2008

Если эти каталоги находятся в одной и той же файловой системе, почему бы просто не

cp -p /home/* /newhome/
person Nikron    schedule 22.12.2008
comment
Я попробую - я могу смонтировать /newhome/ через NFS. Спасибо! - person DV.; 23.12.2008
comment
Это делает это, но все еще есть рекурсия (т.е. она также копирует все подкаталоги и файлы). Есть ли способ сказать, что cp не выполняет рекурсию? - person DV.; 23.12.2008