Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 备份脚本创建存档时出现问题_Bash - Fatal编程技术网

Bash 备份脚本创建存档时出现问题

Bash 备份脚本创建存档时出现问题,bash,Bash,我的备份脚本有点问题。它使用for循环,使用tar归档给定目录中的任何内容。它完美地列出了目录,并为每个目录创建了我希望的单独归档,但变量没有列出要备份的目录的路径。有人能告诉我如何确保变量中填充了正确的信息吗 以下是脚本: #!/bin/bash set -xv dirs=$(ls /home/phoenix/testarchive) dest="/home/phoenix/backup/" archive=".tar.bz2" clear echo "Archiving data..."

我的备份脚本有点问题。它使用
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

正如我所提到的,脚本的命名方式正是我想要的,但实际的数据归档并没有被创建。我确信问题出在
ls
上,但我不知道有什么其他方法可以获得想要的结果…

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

这意味着找不到
folder1
。 为什么? 哪里是
文件夹1
? 它位于
/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
虽然这看起来比你原来的要复杂一些,
更安全。

简而言之,tar使用的是相对路径。我从这个错误消息中得出结论:

tar: folder1: Cannot stat: No such file or directory
无论如何,我建议你把cd放到父目录。 在运行脚本之前,您可能只需通过cd'ing来测试我的理论

cd /home/phoenix/testarchive

您必须小心备份文件的位置,因为它们也将被放在当前目录中,除非您在tar语句中放置路径。

您需要在循环之前使用
cd/home/phoenix/testarchive
,或者在循环中引用源目录时使用绝对路径。我认为
cd
ing更好。这也有效!当我使用
cd
进行测试时,我一定是把它放错了位置(可能是在
清除
命令之前)。谢谢我确实看到了错误,只是不确定如何使用
$dir
变量来反映相对路径。您添加的
dirs\u basedir
变量加法非常有效!!!谢谢@janos:)
cd /home/phoenix/testarchive