我已经开始研究脚本世界,特别是使用bash,我正在尝试编写一个简单的脚本来将文件夹(包含子文件夹)的内容复制到外部的备份位置闪存驱动器(试图备份Thunderbird的数据)。我已经看了几个教程,我遇到的是如何导航到脚本中的父目录的问题。我要复制的文件夹存在于我的脚本文件所在的目录1中。要进入硬盘驱动器,我必须通过两个父目录备份......这是我创建的(我正在运行ubuntu 12.04):
#! /bin/bash
#this attepmts to copy the profile folder for Thunderbird to the backup drive
echo "...attempting to copy Thunderbird Profile to back-up drive (My Passport)"
#attempt to backup two directories to where media folder (and therefore My Passport is located)
parent=$(dirname $PWD)
grandparent=$(dirname $parent)
greatgrand=$(dirname $grandparent)
#show what directories the variables are set to
echo "...parent: $parent"
echo "...grandparent: $grandparent"
echo "...greatgrand: $greatgrand"
echo "...copying..."
#FIRST SUBSHELL
#create a subshell and cd to directory to copy && tar directory
#tar: -c = create tarball, -f = tells it what to create " - " = is the unix convention for stdout (this goes with the -f) " . " = means the whole directory. I the end this first subshell is creating a tarball and dumping it in stdout
# | = pipe
#SECOND SUBSHELL
(cd /mcp/.thunderbird/lOdhn9gd.default && tar -cf - .) | (cd $greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup && tar -xpf -)
当我跑步时,我得到:
mcp@mcp-Satellite-A135:~/BashScriptPractice$ ./thunderProfileBU.sh
...attempting to copy Thunderbird Profile to back-up drive (My Passport)
...parent: /home/mcp
...grandparent: /home
...greatgrand: /
...copying...
./thunderProfileBU.sh: line 23: cd: //media/My: No such file or directory
./thunderProfileBU.sh: line 23: cd: /mcp/.thunderbird/lOdhn9gd.default: No such file or directory
我应该从目录“/ mcp”开始。我猜我不需要它在上面的第一个子脚本(最后一行),但当我试图使用“cd /.thunderbird/lOdhn9g ...”时,我仍然得到错误。对于第二个子脚本,我不确定到底发生了什么。我只是误解了文件夹导航语法吗?
此外,这是一个侧面问题,但是以这种方式编写脚本,软件开发人员应该知道该怎么做,或者这种事情是否更为系统管理员保留?我没有参加任何脚本课程,或者我知道通过我的大学提供的任何课程但是我发现它很有趣并且可以看到它如何非常有用...谢谢!
答案 0 :(得分:1)
首先,我建议使用cp -r
而不是更复杂的tar管道,这只有在你复制网络时才真正有用。
其次,您的脚本存在两个问题:您指定的源目录是/mcp
而不是/home/mcp
,因此无法找到。第二个问题是您指定的目标目录中有一个空格。必须通过在空格前使用反斜杠(\
)或使用引号围绕整个目录来转义该空间:
"$greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup"
我不确定你为什么使用相对路径(“greatgrand”)。通过简单地从/
开始,您似乎最好使用绝对路径。如果您确实想要引用greatgrand目录,请使用../../../
。每个../
上升一级。
答案 1 :(得分:1)
您可以使用dirname
,而..
只是$greatgrand
,而不是使用../../..
来获取每个目录的父级。
现在依赖脚本中的父目录通常是一个坏主意,因为你必须保证它们存在。
脚本失败的地方有两个:
./thunderProfileBU.sh: line 23: cd: //media/My: No such file or directory
您应该保护目录名称,因为它包含空格,而空格是参数分隔符。
./thunderProfileBU.sh: line 23: cd: /mcp/.thunderbird/lOdhn9gd.default: No such file or directory
您要复制的目录不存在。我猜你想要~mcp
,或/home/mcp
。
如果你想要将thunderbird首选项备份到外部驱动器,你应该使用rsync
:
# Make sure directory exists
mkdir -p "/media/My Passport/Gmail_to_Thunderbird_Backup"
# Copy the contents recursively
rsync -av "~/.thunderbird/lOdhn9gd.default/" "/media/My Passport/Gmail_to_Thunderbird_Backup"