web-dev-qa-db-ja.com

ファイル内のテキストを検索し、そのテキストでファイル名を変更します

Linuxサーバーに接頭辞O*****.TXTを付けて保存するシステムからのジョブレポートが多数あります。ファイル内には、レポートのプロセスIDがあります。

ディレクトリ内のすべての'O****.TXTファイルを検索し、各ファイルの名前を各ファイルのプロセスIDに変更するには、どのスクリプトを実行できますか?例えば:

OAAJWNZN.TXTProcID:0000019324で検索し、OAAJWNZN.TXTの名前を0000019324.TXTに変更します。

次に、このファイルの名前が変更されると、スクリプトはディレクトリ内の次のファイルに移動し、同じことを行います。

7
IanG

ファイルを読み取り、名前を変更する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"メソッドを提案しています。次に、次のファイルにスキップします。

7
muru

ファイルがあるディレクトリでforrenameおよび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/"oldnewに置き換えます($拡張で変数を渡すことができるように、単一引用符の代わりにdoubleを使用します)
  • $(command)コマンド置換-commandの出力を他の何かに渡す
  • .*\.TXTは、リテラル.に続いてTXTが続く任意の文字に一致します
  • sed友人を呼び出しますsedはファイルを読み取り、ファイルから物を抽出します
  • -n要求するまで何も出力しない
  • -rはEREを使用するため、()または+をエスケープする必要はありません
  • ( |^)スペースまたは行の始まり
  • ProcID:([0-9]+) ProcIDの後に少なくとも1桁...後で使用するために番号を保存します
  • ( |$)スペースまたは行末
  • \2()で以前に保存されたパターンへの後方参照
  • p編集後に結果を出力します
6
Zanna
  1. ファイルをループします。
  2. ProcIDを見つけるためにgrepを使用できます
  3. ファイルを新しいファイル名に移動します

古いファイルを保持したい場合や不明な場合は、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
4
pLumo