Сжатие одного файла вместо целого каталога - PullRequest
1 голос
/ 11 ноября 2011

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

    #!/bin/sh

# Where to backup to.
mkdir -p /home/knoppix/backups --verbose
dest="/home/knoppix/backups"

# What to backup.
cat /etc/passwd >> /home/knoppix/backups/dbusers.txt
backupdb="/home/knoppix/backups/dbusers.txt"

# Create archive filename.
archive_file="DB$(date +%d%b%Y_%H%M).tgz"

# Print start status message.
echo "Backing up $backupdb to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backupdb

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Попробуйте использовать tar -C для перемещения в каталог:

#!/bin/sh

# Where to backup to.
mkdir -p /home/knoppix/backups --verbose
dest="/home/knoppix/backups"

# What to backup.
cat /etc/passwd >> /home/knoppix/backups/dbusers.txt
backupdir="/home/knoppix/backups"
backupfile="dbusers.txt"

# Create archive filename.
archive_file="DB$(date +%d%b%Y_%H%M).tgz"

# Print start status message.
echo "Backing up $backupdb to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file -C $backupdir $backupfile

В GNU tar также предусмотрена опция --transform, которую можно использовать для настройки имени для создания или извлечения архива.Другой способ изменить ваш оригинальный скрипт - это сделать что-то вроде:

#!/bin/sh

# Where to backup to.
mkdir -p /home/knoppix/backups --verbose
dest="/home/knoppix/backups"

# What to backup.
cat /etc/passwd >> /home/knoppix/backups/dbusers.txt
backupdir="/home/knoppix/backups"
backupfile="dbusers.txt"

# Create archive filename.
archive_base_name="DB$(date +%d%b%Y_%H%M)"
archive_file="$archive_base_name.tgz"

# Print start status message.
echo "Backing up $backupdb to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar --transform="s#^$base#$archive_base_name#" czPf $dest/$archive_file $backupdb

Аргумент --transform говорит о замене одной строки текста другой, например s#old#new#.Часть old на самом деле является шаблоном, называемым регулярным выражением, а ^ приведет к тому, что регулярное выражение будет совпадать только в начале строки.И PczPf) говорит tarу не удалять '/' из начала путей.Таким образом, в этом примере tar будет создан с чем-то вроде:

DB11Nov2011_0555/dbusers.txt

Если у вас есть существующий архив, содержащий файл с именем, подобным «dbusers.txt», вы можете использовать --transform, чтобы извлечь его вдругое имя или каталог:

tar --transform="s#dbusers#original#" xzf example.tgz # creates original.txt
tar --transform="s#^#output/#" xzf example.tgz        # creates output/dbusers.txt

Попробуйте добавить v к параметрам tar (czPvf), чтобы он отображал имена файлов по мере их добавления или извлечения.При использовании --transform может также помочь использование --show-transformed-names, чтобы флаг v отображал результаты замещения вместо исходных имен.

Наконец, для получения дополнительной справки по устранению неполадок попробуйтедобавление set -x вверху скрипта (или непосредственно перед командой tar).Это заставит оболочку напечатать команду перед ее выполнением.Полезная часть заключается в том, что после оценки переменных и подстановочных знаков будут отображаться значения .

Вы даже можете попробовать это в командной строке.Для выключения используйте set +x:

$ set -x
$ archive_file="DB$(date +%d%b%Y_%H%M).tgz"
++ date +%d%b%Y_%H%M
+ archive_file=DB11Nov2011_0605.tgz
$ echo $archive_file
+ echo DB11Nov2011_0605.tgz
DB11Nov2011_0605.tgz
$ set +x
+ set +x
$ echo $archive_file
DB11Nov2011_0605.tgz
1 голос
/ 11 ноября 2011

Как насчет:

# Backup the files using tar.
(cd /home/knoppix/backups/; tar czf $dest/$archive_file dbusers.txt)
...