2017-07-18 64 views
1

我的备份脚本存在一些问题。它使用for循环来使用tar对给定目录内的任何内容进行归档。它完美地列出了这些目录,并为每个目录创建了独立的存档,我希望它们如何,但该变量未列出要备份的目录的路径。任何人都可以给我一个如何确保变量填充正确信息的想法吗?备份脚本创建存档问题

这里的脚本:

#!/bin/bash 
set -xv 
dirs=$(ls /home/phoenix/testarchive) 
dest="/home/phoenix/backup/" 
archive=".tar.bz2" 

clear 
echo "Archiving data..." 

for dirs in $dirs 
do 
    echo "Archiving $dirs..." 
    tar cjf "${dest}${dirs}_$(date +%F)${archive}" $dirs 
    echo "Archive complete!!" 
done 

echo "All archives created!!" 
echo "Test created archive to ensure validity." 

ls -lh $dest 

这里是我的错误输出:

echo "Archiving data..." 
+ echo 'Archiving data...' 
Archiving data... 

for dirs in $dirs 
do 
    echo "Archiving $dirs..." 
    tar cjf "${dest}${dirs}_$(date +%F)${archive}" $dirs 
    echo "Archive complete!!" 
done 
+ for dirs in $dirs 
+ echo 'Archiving folder1...' 
Archiving folder1... 
++ date +%F 
+ tar cjf /home/phoenix/backup/folder1_2017-07-18.tar.bz2 folder1 
tar: folder1: Cannot stat: No such file or directory 
tar: Exiting with failure status due to previous errors 
+ echo 'Archive complete!!' 
Archive complete!! 
+ for dirs in $dirs 
+ echo 'Archiving folder2...' 
Archiving folder2... 
++ date +%F 
+ tar cjf /home/phoenix/backup/folder2_2017-07-18.tar.bz2 folder2 
tar: folder2: Cannot stat: No such file or directory 
tar: Exiting with failure status due to previous errors 
+ echo 'Archive complete!!' 
Archive complete!! 

echo "All archives created!!" 
+ echo 'All archives created!!' 
All archives created!! 
echo "Test created archive to ensure validity." 
+ echo 'Test created archive to ensure validity.' 
Test created archive to ensure validity. 

ls -lh $dest 
+ ls -lh /home/phoenix/backup/ 
total 8.0K 
-rw-r--r-- 1 phoenix phoenix 46 Jul 18 13:48 folder1_2017-07-18.tar.bz2 
-rw-r--r-- 1 phoenix phoenix 46 Jul 18 13:48 folder2_2017-07-18.tar.bz2 

脚本,就像我提到的,被命名正是我想要的,但实际的数据归档ISN”没有创造。我敢肯定ls是问题,但我不知道任何其他方式获得所需的结果...

+0

您可以在循环前使用'cd/home/phoenix/testarchive'或在引用循环内的源目录时使用绝对路径。我认为'cd'ing更好。 – codeforester

+0

这也适用!当我使用'cd'测试时,我必须将它放在错误的位置(可能在'clear'命令之前)。谢谢!!! –

回答

0

简短的回答是tar使用相对路径。我从这个错误信息得出结论:

tar: folder1: Cannot stat: No such file or directory 

无论如何,我建议你cd到父目录。 您可以在运行脚本之前通过cd'ing测试我的理论。

cd /home/phoenix/testarchive 

你必须要小心的备份文件的位置,因为它们将被放置在当前目录下,也除非你把一个路径在焦油声明。

1

它总是好的仔细阅读错误消息,并理解他们:

+ tar cjf /home/phoenix/backup/folder1_2017-07-18.tar.bz2 folder1 
tar: folder1: Cannot stat: No such file or directory 
tar: Exiting with failure status due to previous errors 

这意味着无法找到folder1。 为什么? folder1在哪里? 它在/home/phoenix/testarchive目录中。 当您执行脚本时, 是当前工作目录/home/phoenix/testarchive? 可能不是。

我建议写剧本是这样的:

#!/bin/bash 

set -xv 
dirs_basedir=/home/phoenix/testarchive 
dest="/home/phoenix/backup" 
archive=".tar.bz2" 

clear 
echo "Archiving data..." 

for path in "$dirs_basedir"/* 
do 
    basedir=${path%/*} 
    dir=${path##*/} 
    echo "Archiving $dir in $basedir..." 
    tar cjf "${dest}/${dirs}_$(date +%F)${archive}" -C "$basedir" "$dir" 
    echo "Archive complete!!" 
done 

echo "All archives created!!" 
echo "Test created archive to ensure validity." 

ls -lh $dest 

虽然这可能看起来有点复杂得多,你原来, 它的安全。

+0

我确实看到了错误,我只是不确定如何进入'$ dir'变量来反映相对路径。你添加的'dirs_basedir'变量添加工作就像一个魅力!谢谢@janos :) –