0

findコマンドでボリュームをファイルに書き込み、そのファイルをmysqlデータベースにロードする次のシェルスクリプトがあります。

# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE
sudo find $ARCH1/ >> $FILE
sudo find $ARCH2/ >> $FILE
sudo find $MASTERING/ >> $FILE

# load the file into the mysql database, `files`, table `path`
/usr/local/bin/mysql -u root files -e "TRUNCATE path"
/usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"

TRUNCATE新しいエントリを追加する前に、すべての古いエントリを削除するために使用されます。ただし、いずれかfindコマンドが機能しない場合 (たとえば、ボリュームにアクセスできない場合)、2 つのmysqlコマンドをスキップする必要があります。これを行うには、上記のスクリプトをどのように変更しますか?

4

3 に答える 3

2

これによりmysql、すべてのfindコマンドが成功した場合にのみ、2 つのコマンドが実行されます。

# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE &&
sudo find $ARCH1/ >> $FILE &&
sudo find $ARCH2/ >> $FILE &&
sudo find $MASTERING/ >> $FILE &&
{
  # load the file into the mysql database, `files`, table `path`
  /usr/local/bin/mysql -u root files -e "TRUNCATE path"
  /usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"
}

&&オペレーターは、LHS 上のコマンドが成功した場合にのみ、RHS 上のコマンドを実行させます。は{ ... }、2 つのmysqlコマンドを 1 つの複合コマンドにグループ化するため、両方が実行されるか (最後のコマンドfindが成功した場合) 、どちらも実行されfindません (最後のコマンドが失敗した場合)。

findこれは、 s が成功してmysqlコマンドが実行されるかどうかに関係なく実行する必要があるスクリプトがさらにある場合に使用できます。

于 2013-01-27T22:01:39.040 に答える
0

上記の検索コマンドで行を使用#!/bin/bash -eまたは追加できます。set -eそうすれば、Bash はコマンドが失敗するとすぐに自動的に中止されます。前のコマンドが失敗したときに続行することはめったにないため、常にデフォルトでこれを行うことをお勧めします。

set -e

# find all the paths and print them to a file
sudo find $FULFILLMENT/ > $FILE
sudo find $ARCH1/ >> $FILE
sudo find $ARCH2/ >> $FILE
sudo find $MASTERING/ >> $FILE

# load the file into the mysql database, `files`, table `path`
/usr/local/bin/mysql -u root files -e "TRUNCATE path"
/usr/local/bin/mysql -u root files -e "LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path"
于 2013-01-27T20:53:18.773 に答える
0

何かのようなもの:

sudo find $FULFILLMENT > $FILE || exit 1
于 2013-01-27T20:39:24.103 に答える