распаковка набора каталогов и создание сжатого файла tar - PullRequest
14 голосов
/ 27 июля 2010

Мой баш-фу совсем не тот, кем должен быть.

Я хочу создать небольшой пакетный скрипт, который будет копировать список каталогов в новый zip-файл.

Есть (по крайней мере) два способа проверки списка файлов:

  1. чтение из файла (скажем, config.txt). Файл будет содержать список каталогов для архивирования ИЛИ

  2. жесткий код списка прямо в bash-скрипте

Первый вариант кажется более простым (хотя и менее элегантным).

Две проблемы, с которыми я сталкиваюсь, заключаются в том, что я не уверен, как сделать следующее:

  • предоставить список каталогов для скрипта оболочки
  • перебрать список каталогов

Может ли кто-нибудь предложить в нескольких строках, как я могу это сделать?

Кстати, я работаю на Ubuntu 10.0.4

Ответы [ 5 ]

29 голосов
/ 27 июля 2010

Вы можете создать tar-архив в командной строке следующим образом:

tar czvf mytar.tar.gz dir1 dir2 .. dirN

Если вы захотите сделать это в скрипте bash и передать каталоги в качестве аргументов скрипту, эти аргументы будут заканчиваться на $@. Итак, у вас есть:

tar czvf mytar.tar.gz "$@"

Если это в скрипте (скажем, myscript.sh), вы бы назвали это:

./myscript.sh dir1 dir2 .. dirN

Если вы хотите читать из списка (ваш вариант 1), вы можете сделать это следующим образом (это не работает, если в именах каталогов есть пробелы):

tar czvf mytar.tar.gz $(<config.txt)
0 голосов
/ 04 марта 2015

Если вы ищете сжатие каталога, может помочь следующая команда.

pbzip2 сжимает каталоги с использованием параллельной реализации

tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name>
0 голосов
/ 27 июля 2010

Просто используйте нулевой байт в качестве разделителя при записи имен файлов / каталогов в файл. Таким образом, вам не нужно беспокоиться о пробелах, новых строках и т. Д. В именах файлов!

printf "%s\000" */ > listOfDirs.txt    # alternative: find ... -print0 

while IFS="" read -r -d '' dir; do command ls -1abd "$dir"; done < listOfDirs.txt

tar --null -czvf mytar.tar.gz --files-from listOfDirs.txt 
0 голосов
/ 27 июля 2010

Вы можете экспортировать переменную, например DIRECTORIES = "DIR1 DIR2 DIR3 ...." А в скрипте нужно использовать переменную вроде tar czvf $ DIRECTORIES

0 голосов
/ 27 июля 2010

создать два файла: filelist - разместить все необходимые каталоги (по одной на одной строке)

и создайте простой скрипт bash:

    #!/bin/bash


for DIR in `cat filelist` 
do 
    if [ -d $DIR ] 
    then
        echo $DIR
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...