0

我刚刚开始研究脚本的世界,特别是使用 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 ...”时,我仍然收到错误消息。对于第二个子脚本,我不确定到底发生了什么。我只是误解了文件夹导航语法吗?

此外,这是一个附带问题,但是以这种方式编写脚本是软件开发人员应该知道如何做的事情,还是这种事情更多地留给系统管理员?我没有参加任何脚本课程,或者我知道我的大学提供的任何课程,但是我觉得它很有趣,并且可以看到它是如何非常有用的......谢谢!

4

2 回答 2

1

首先,我建议使用cp -r而不是更复杂的 tar 管道,这仅在您在网络上复制时才真正有用。

其次,您的脚本有两个问题:您指定的源目录是/mcp和不是/home/mcp,因此无法找到。第二个问题是您指定的目标目录中有一个空格。该空格必须通过在空格前使用反斜杠 ( \) 或用引号括住整个目录来转义:

"$greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup"

我不确定您为什么使用相对路径(“greatgrand”)。似乎最好使用绝对路径,只需从/. 如果你真的想引用 greatgrand 目录,使用../../../. 每个../都上升一个级别。

于 2012-09-12T04:57:02.917 回答
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.

如果您想要将您的雷鸟偏好备份到外部驱动器,您应该使用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"
于 2012-09-12T04:58:08.087 回答