
Мне потребовалось создать зеркальное отображение существующих каталогов Linux и подкаталогов папок, как показано ниже.
у нас есть каталог «/opt/current», в котором есть еще один уровень из 20 подкаталогов и еще один уровень с 50 подкаталогами и так далее... еще несколько более глубоких уровней для подкаталогов, и в общей сложности у нас есть 1000 каталогов от родительского к дочернему. /opt/current смонтирован на устройстве Oracle ZFS.
Как создать точную структуру зеркальных каталогов/подкаталогов в новом расположении /opt/New, а не вручную, как в каталоге «один к одному», и применить разрешения. /opt/New смонтирован на другом устройстве ZFS.
Есть ли способ/скрипт для создания всей структуры каталогов от родительского до дочернего с теми же владельцами/группами/другими разрешениями в /opt/New path, что и в /opt/current path?
спасибо, КГ
решение1
rsync -av --include='*/' --exclude='*' /opt/current/ /opt/New
Это позволит rsync
точно дублировать структуру каталогов, /opt/local
избегая /opt/New
при этом копирования каких-либо файлов.
Параметр -a
( --archive
) гарантирует, что все разрешения и т. д. будут сохранены (этот параметр также подразумевает рекурсивное копирование), а -v
( --verbose
) будет отображать ход выполнения команды.
С помощью --include='*/'
мы явно включаем любой каталог в передачу, но исключаем все остальное с помощью --exclude='*'
. Порядок этих параметров в командной строке важен.
В /
конце /opt/current/
также важен символ «», так как без него результатом было бы создание, /opt/New/current
а не непосредственное вписывание /opt/New
.
решение2
POSIXly и при условии, что имена каталогов не содержат символов новой строки, а $srcdir
и $dstdir
являются абсолютными путями:
(cd -P "$srcdir" && find . -type d | pax -rwdpe "$dstdir/")
Некоторые pax
реализации поддерживают получение списков файлов, разделенных символами NUL, для копирования с -0
возможностью разрешения имен файлов с символами NUL:
(cd -P "$srcdir" && find . -type d -print0 | pax -0rwdpe "$dstdir/")
( -print0
также является расширением, не входящим в POSIX).
решение3
В качестве альтернативыrsync
find /opt/current -type d -print0 | cpio -0pma backup/dir/
решение4
Вы можете создать скрипт, подобный следующему... поместить его в файл:
-- синтаксис скрипта bash/ksh необходимо будет изменить в зависимости от оболочки ----
find . -name "*"|while read line
do
if [[ -d ${line} ]]
then
echo ${line}
fi
do
на сервере вы создаете файл
cat file |while read line
do
mkdir ${line}
done