0

1 つのディレクトリ内のファイルのバッチの名前を、ファイルの内容の最初の行のバッククォートの間の文字に変更する必要があります。

ファイル名: schema.stored.procedure302
ファイル の最初の行は次のとおりです。

/* Procedure structure for procedure `usp_stored_procedure_abc` */

必要な新しいファイル名: usp_stored_procedure_abc.sql


シナリオをもう少し詳しく説明します。

mysqldump のストア プロシージャのみを含む単一の schema.sprocs.sql ファイルがあります。

csplit を使用して、ファイルを 300 以上の個別の SQL ファイルに分割しました

csplit -f schema.stored.procedure schema.sprocs.sql '/Procedure structure for procedure/' {*}

これは見事に機能し、今では次のようなファイルがあります。

schema.stored.procedure302
schema.stored.procedure303
schema.stored.procedure304
など...

私が助けを必要として
いるのは、各ファイルの内容を読み取り、パターンを見つけるために使用できるコマンドは次のとおりです。

/* Procedure structure for procedure `

次に、バッククォートが見つかるまで、そのパターンに従う文字でファイルの名前を変更します。

例えば:

ファイル schema.stored.procedure302 には、最初の行に次の行が含まれています。

/* Procedure structure for procedure `usp_stored_procedure_abc` */

そのファイルの名前を次のように変更する必要があります: usp_stored_procedure_abc.sql (ファイルの内容の最初の行のバックティック間の内容)。

私はこれが実現可能であると確信しています、誰かが私を助けることができますか?

4

1 に答える 1

3

次の文字列は、新しいファイル名を取得する方法を示しています。

head -n 1 file |awk -F'[`]' '{print $2".sql"}'

完全なスクリプトは次のようになります。

#!/bin/bash
for f in *;
do
  d="$(head -n 1 $f |awk -F'[`]' '{print $2".sql"}')" ;
  if [ ! -f "$d" ];
  then
    mv "$f" "$d"
  else echo "File '$d' already exists! Skiped!"
  fi
done
于 2013-04-27T03:20:33.707 に答える