Поскольку tar
делает каталоги автоматически, вам действительно не нужно много делать.Предполагая, что GNU tar:
tar -C /fss/fin -cf - essbase |
tar -C /fs/fi -xf -
Опция '-C
' меняет каталог перед началом работы.Первый tar
записывает в стандартный вывод (единственный '-') все, что находится в каталоге essbase
.Выходные данные этого tar
передаются по каналу ко второму tar
, который читает его стандартный ввод (одинокий '-'; веселье не так!).
Предположим, GNU findможет также сделать:
(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed '/^\.$/d')) |
tar -xf - -C /fs/fi
Это изменяет каталог на исходный каталог;он выполняет поиск с максимальной глубиной 1, чтобы найти каталоги, и удаляет текущий каталог из списка с помощью sed;первый «tar» затем записывает вывод во второй, что аналогично предыдущему (за исключением того, что я изменил порядок аргументов, чтобы подчеркнуть параллелизм между двумя вызовами).
Если вашВ каталогах верхнего уровня (которые в действительности находятся в / fss / fin) есть пробелы в именах, тогда есть больше работы, которую нужно сделать снова - я предполагаю, что ни один из резервных копий каталогов не начинается с '.':
(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) |
tar -xf - -C /fs/fi
Это отсеивает не-каталоги из списка, сгенерированного '*', и записывает их с NUL '\ 0' (нулевые байты), отмечая конец каждого имени (вместо новой строки).Вывод записывается в 'xargs', который настроен на ожидание имен, заканчивающихся NUL, и запускает 'tar' с правильными именами каталогов.Вывод этого ансамбля отправляется во второй tar, как и раньше.
Если у вас есть имена каталогов, начинающиеся с '.'собрать, затем добавить '.[a-z]*
' или другой подходящий шаблон после '*';Крайне важно, чтобы то, что вы используете, не содержало списка "."или же '..'.Если в каталоге есть имена, начинающиеся с тире, вам нужно использовать './*
' и './.[a-z]*
'.
Если у вас есть еще более извращенные требования, четко сформулируйте их в поправкена вопрос.