Так как tar
делает каталоги автоматически, вам действительно не нужно делать очень много. Предполагая, что смола GNU:
tar -C /fss/fin -cf - essbase |
tar -C /fs/fi -xf -
Опция '-C
' изменяет каталог перед операцией. Первый tar
записывает в стандартный вывод (одинокий "-") все, что находится в каталоге essbase
. Вывод этого tar
передается второму tar
, который считывает свой стандартный ввод (одинокий '-'; забавно, не так ли!).
Предполагая, что GNU найдет, вы также можете сделать:
(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed '/^\.$/d')) |
tar -xf - -C /fs/fi
Это изменяет каталог на исходный каталог; он запускает «find» с максимальной глубиной 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]*
'.
Если у вас есть еще более извращенные требования, изложите их четко в поправке к вопросу.
person
Jonathan Leffler
schedule
22.10.2010