Сценарий Unix для поиска всех папок в каталоге, затем tar и перемещения их

В основном мне нужно запустить сценарий Unix, чтобы найти все папки в каталоге /fss/fin, если он существует; затем я заархивирую его и перейду в другой каталог /fs/fi.

Это моя команда до сих пор:

find /fss/fin -type d -name  "essbase" -print

Здесь я прямо упомянул имя папки essbase. Но вместо этого я хотел бы найти все папки в /fss/fin и использовать их все.

Как мне найти все папки в каталоге /fss/fin и заархивировать их, чтобы переместить в /fs/fi?

Уточнение 1:

Да, мне нужно найти только все папки в каталоге /fss/fin, используя сценарий оболочки Unix, и переместить их в другой каталог /fs/fi.

Уточнение 2:

Я хочу прояснить это требование. Сценарий оболочки должен содержать:

  1. Найдите все папки в каталоге /fss/fin
  2. Смолить папки
  3. Переместите папки в другую директорию /fs/fi, расположенную на сервере s11003232sz.net.
  4. По запросу пользователя он должен распаковать папки и переместить их обратно в исходный каталог /fss/fin.

person Shenna    schedule 22.10.2010    source источник
comment
вам нужны все файлы в папках или только сами папки?   -  person seejay    schedule 22.10.2010
comment
Пожалуйста, отредактируйте вопрос, чтобы уточнить требования.   -  person Jonathan Leffler    schedule 22.10.2010
comment
Вам все еще нужно подумать и объяснить более четко, что вы ищете. В частности, существует ли произвольный промежуток времени между шагами 1..3 и шагами 4? Один сценарий — не лучший способ справиться с такими временными промежутками. Где должен быть размещен файл tar? Непонятно, что вы имеете в виду на шаге 3 - что означает комментарий «который на сервере xxxx»? Вы хотите перенести данные на другую машину? Почему 4 не «переместить папки в исходное место»? Зачем перемещать каталоги, если вы сделали копию в файле tar? Почему бы просто не удалить папки? Какова реальная цель? Домашнее задание?   -  person Jonathan Leffler    schedule 22.10.2010


Ответы (5)


вот пример, с которым я работаю, который может привести вас в правильном направлении

BackUpDIR="/srv/backup/"
SrvDir="/srv/www/"
DateStamp=$(date +"%Y%m%d");

for Dir in $(find $SrvDir* -maxdepth 0 -type d ); 
do
    FolderName=$(basename $Dir);
    tar zcf "$BackUpDIR$DateStamp.$FolderName.tar.gz" -P $Dir
done
person Chris Hough    schedule 02.10.2011
comment
вопрос и ваш повтор дают нам идею сжать ежедневную папку cpanel, когда она использует добавочный метод, взгляните на subversion.assembla.com/svn/lhth/trunk/bash/ так что спасибо за ваш повтор и за вашу помощь - person Mohammed Shannaq; 17.01.2012

Так как 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
comment
Сценарий Unix должен сначала найти все папки, а затем смолить их, так как мы можем написать сценарий оболочки unix - person Shenna; 22.10.2010
comment
Это сценарий оболочки (двухстрочный); ему не нужно искать папки, потому что tar может сделать это за вас. Если вам нужно больше, чем просто каталог essbase, у нас есть еще немного работы. - person Jonathan Leffler; 22.10.2010
comment
Как мы можем написать сценарий для этого - person Shenna; 22.10.2010
comment
Я получаю кодировку в порядке, я хочу прояснить требование, которое должен содержать сценарий оболочки: 1) Найдите все папки в каталоге / fss / fin 2) Смолите папки 3) Переместите папки в другой каталог / fs / fi, который на сервере s11003232sz.net 4) Когда пользователь запрашивает распаковать папки и переместить их обратно в исходный каталог /fss/fin - person Shenna; 22.10.2010

find /fss/fin -d 1 -type d -name "*" -print

Приведенная выше команда дает вам список подкаталогов 1-го уровня файла /fss/fin. Тогда с этим можно делать что угодно. Например. tar их в выходной каталог, как в приведенной ниже команде

tar -czf /fss/fi/outfile.tar.gz `find /fss/fin -d 1 -type d -name "*" -print`

Исходная структура каталогов будет воссоздана после распаковки.

person Max Doronin    schedule 26.10.2010

Вот пример bash (замените /fss/fin, /fs/fi вашими путями):

dirs=($(find /fss/fin -type d))
for dir in "${dirs[@]}"; do
  tar zcf "$dir.tgz" "$dir" -P -C /fs/fi && mv -v "$dir" /fs/fi/
done

который находит все папки, тарирует их по отдельности, и в случае успеха - перемещает в другую папку.

person kenorb    schedule 11.09.2015

Это должно сделать это:

#!/bin/sh

list=`find . -type d`

for i in $list
do
    if [ ! "$i" == "." ]; then
        tar -czf ${i}.tar.gz ${i}
    fi
done

mv *.tar.gz ~/tardir
person Ankur Agarwal    schedule 23.10.2010
comment
Примечание: не будет работать для каталогов с пробелами в имени. - person kenorb; 12.09.2015