Linuxサーバーに接頭辞O*****.TXT
を付けて保存するシステムからのジョブレポートが多数あります。ファイル内には、レポートのプロセスIDがあります。
ディレクトリ内のすべての'O****.TXT
ファイルを検索し、各ファイルの名前を各ファイルのプロセスIDに変更するには、どのスクリプトを実行できますか?例えば:
OAAJWNZN.TXT
をProcID:0000019324
で検索し、OAAJWNZN.TXT
の名前を0000019324.TXT
に変更します。
次に、このファイルの名前が変更されると、スクリプトはディレクトリ内の次のファイルに移動し、同じことを行います。
ファイルを読み取り、名前を変更するawkコマンド:
awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT
ProcID
行は実際には次のとおりです。
JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45
I、Pを抽出するには、:
と)
の両方で分割する必要があります。これにより、2番目のフィールドとして0000019324
が得られます。
echo
を削除して、実際に移動を実行します。これは、ファイル名とProcID
にスペースや特殊文字が含まれていない場合にのみ使用してください。
このコマンドは、:
で分割してProcID
を取得し、2番目のフィールドを取得してから、それと特別な変数FILENAME
を使用してコマンドを作成します。 GNU awkのドキュメント はprintf ... | "/bin/sh"
メソッドを提案しています。次に、次のファイルにスキップします。
ファイルがあるディレクトリでfor
、rename
およびsed
を使用できます。
for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done
実際にファイルの名前を変更するテストの後、rename
の後に-n
を削除します
for i in O*TXT; do
一致するすべてのファイルで何かをするrename -n
は新しい名前を報告するだけで、実際には名前を変更しないでください(テスト後に-n
を削除してください)"s/old/new/"
をold
でnew
に置き換えます($
拡張で変数を渡すことができるように、単一引用符の代わりにdoubleを使用します)$(command)
コマンド置換-command
の出力を他の何かに渡す.*\.TXT
は、リテラル.
に続いてTXT
が続く任意の文字に一致しますsed
友人を呼び出しますsed
はファイルを読み取り、ファイルから物を抽出します-n
要求するまで何も出力しない-r
はEREを使用するため、()
または+
をエスケープする必要はありません( |^)
スペースまたは行の始まりProcID:([0-9]+)
ProcIDの後に少なくとも1桁...後で使用するために番号を保存します( |$)
スペースまたは行末\2
()
で以前に保存されたパターンへの後方参照p
編集後に結果を出力します古いファイルを保持したい場合や不明な場合は、mvの代わりにcpを実行します。
for file in 0*.TXT; do
procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
new_filename="/outputpath/${procid}.TXT";
if [ ! -f "$newfilename" ]; then
mv "$file" "$new_filename";
fi;
done