Unix скрипт для поиска всех папок в каталоге, затем tar и перемещения их - PullRequest
0 голосов
/ 22 октября 2010

В основном мне нужно запустить скрипт Unix, чтобы найти все папки в каталоге / fss / fin, если он существует;затем у меня есть tar и я перехожу в другой каталог /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. Tar папки
  3. Переместить папки в другой каталог /fs/fi, которыйнаходится на сервере s11003232sz.net
  4. По запросам пользователей следует разархивировать папки и переместить их обратно в оригинальный каталог /fss/fin

Ответы [ 5 ]

5 голосов
/ 02 октября 2011

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

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
2 голосов
/ 22 октября 2010

Поскольку 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]*'.

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

0 голосов
/ 12 сентября 2015

Вот пример 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

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

0 голосов
/ 26 октября 2010
find /fss/fin -d 1 -type d -name "*" -print

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

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

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

0 голосов
/ 24 октября 2010

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

#!/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
...