2017-07-18 25 views
1

私のバックアップスクリプトに問題があります。 を使用して、forループを使用して、指定されたディレクトリ内のすべてのものをアーカイブします。それはディレクトリを完全にリストし、それぞれのディレクトリごとに別々のアーカイブを作成しますが、変数はバックアップするディレクトリへのパスをリストしていません。誰にでも、変数に正しい情報が入力されていることを確認する方法のアイデアを教えてもらえますか?ここで バックアップスクリプトの作成に関する問題

はスクリプトです:

#!/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'変数の追加は、魅力的に働きました!ありがとう@ヤノス:) –

関連する問題