2017-07-18 62 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 :) –