Попробуйте использовать 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
на самом деле является шаблоном, называемым регулярным выражением, а ^
приведет к тому, что регулярное выражение будет совпадать только в начале строки.И P
(в czPf
) говорит 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