2010-10-22 2 views
0

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

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

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

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

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

Разъяснение 1:

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

Разъяснение 2:

Я хочу, чтобы было ясно с требованием. Shell Script должен содержать:

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

Вам нужны все файлы в папках или только сами папки? – seejay

+0

Пожалуйста, отредактируйте вопрос, чтобы уточнить требования. –

+0

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

ответ

2

Так как 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 

Это меняет каталог в исходном каталоге; он запускает «найти» с максимальной глубиной 1, чтобы найти каталоги и удаляет текущий каталог из списка с помощью «sed»; первый «tar» затем записывает вывод во второй, который является таким же, как и раньше (за исключением того, что я переключил порядок аргументов, чтобы подчеркнуть параллельность между двумя вызовами).


Если ваши каталоги верхнего уровня (те, на самом деле в/ФСН/плавник) имеют пробелы в именах, то есть больше работы, чтобы сделать еще раз - я не уверен, предполагая, ни один из каталогов для резервного копирования начало с «»:

(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) | 
tar -xf - -C /fs/fi 

Это отсеивает не-каталоги из списка, порожденного „*“, и записывает их с NUL „\ 0“ (ноль байт) маркируя конец каждого имени (вместо новой строки). Выход записывается в «xargs», который настроен на ожидание имен с завершающим NUL, и он запускает «tar» с правильными именами каталогов. Вывод этого ансамбля, как и раньше, отправляется во второй дегт.

Если у вас есть имена каталогов, начинающиеся с символа '.' для сбора, затем добавить «.[a-z]*» или другой подходящий шаблон после «*»; крайне важно, чтобы то, что вы используете, не перечислило '.' или '..'. Если у вас есть имена, начинающиеся с тире в каталоге, вам необходимо использовать «./*» и «./.[a-z]*».

Если у вас есть еще более извращенные требования, четко пропишите их в поправке к вопросу.

+0

Unix-скрипт должен сначала найти все папки, а затем tar, поэтому, как мы можем написать сценарий оболочки unix – Shenna

+0

Это сценарий оболочки (двухстрочный); ему не нужно находить папки, потому что «tar» хорош для этого. Если вы хотите больше, чем просто каталог «essbase», то у нас есть еще немного работы. –

+0

Как мы можем написать сценарий для этого – Shenna

-1

Это следует сделать это:

#!/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 
+0

Сторона -note: не будет работать для каталогов с пробелами в имени. – kenorb

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

Эта команда дает вам список 1-го уровня подкаталогов в/ФСН/плавника. Тогда вы можете сделать что-нибудь с этим. Например. выгрузите их в выходной каталог, как в команде ниже

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

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

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 
+1

вопрос и ваш повтор дают нам идею сжимать ежедневную папку cpanel, когда он использует инкрементный метод, взгляните на http://subversion.assembla.com/svn/lhth/trunk/bash/compress_folder_folders.sh, так что спасибо за ваш повторить и за вашу помощь –

0

Вот пример баш (изменение /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 

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

Смежные вопросы