0

私は、特にbashを使用してスクリプトの世界を調べ始めたばかりで、フォルダー(サブフォルダーを含む)の内容を外部フラッシュドライブのバックアップ場所にコピーする簡単なスクリプトを作成しようとしています( Thunderbirdのデータをバックアップしようとしています)。私はいくつかのチュートリアルを見てきましたが、私が遭遇しているのは、スクリプト内で親ディレクトリに移動する方法の問題です。コピーしたいフォルダは、スクリプトファイルがある上のディレクトリ1にあります。ハードドライブにアクセスするには、2つの親ディレクトリを介してバックアップする必要があります...これが私が作成したものです(私は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 ...」を使用しようとすると、まだエラーが発生していました。2番目のサブスクリプトについては、何が起こっているのか正確にはわかりません。フォルダナビゲーションの構文を誤解しているだけですか?

また、これは副次的な質問ですが、この方法でスクリプトを作成することは、ソフトウェア開発者が知っておくべきことですか、それともこの種のことはシステム管理者のために予約されていますか?私はスクリプトのクラスを受講したことがないか、大学で提供されているものを知っていますが、それは面白いと思い、それがどのように非常に役立つかを見ることができます...ありがとう!

4

2 に答える 2

1

まずcp -r、より複雑なtarパイプラインの代わりに使用することをお勧めします。これは、ネットワーク上でコピーする場合にのみ非常に役立ちます。

次に、スクリプトには2つの問題があります。指定したソースディレクトリが存在する場合と存在/mcpしない/home/mcpため、見つかりませんでした。2番目の問題は、指定したターゲットディレクトリにスペースが含まれていることです。\そのスペースは、スペースの前に円記号()を使用するか、ディレクトリ全体を引用符で囲むことによってエスケープする必要があります。

"$greatgrand/media/My Passport/Gmail_to_Thunderbird_Backup"

相対パス(「greatgrand」)を使用している理由がわかりません。単純に。で始めることにより、絶対パスを使用する方がよいようです/。本当にgreatgrandディレクトリを参照したい場合は、を使用してください../../../。それぞれ../が1レベル上がります。

于 2012-09-12T04:57:02.917 に答える
1

各ディレクトリの親を取得するためにを使用する代わりに、を使用dirnameできます。..ここで、$greatgrandは単純に../../..です。

現在、スクリプトで親ディレクトリに依存することは、それらが存在することを保証する必要があるため、多くの場合、悪い考えです。

スクリプトが失敗する場所は2つあります。

./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"
于 2012-09-12T04:58:08.087 に答える