テキストファイル行の特定の部分からフォルダを作成する

テキストファイル行の特定の部分からフォルダを作成する

私の親フォルダにはサブフォルダが含まれています。各サブフォルダには次のフォルダがあります。

Parent_folder
folder1
  folder_01_PAP_515151
  folder_02_PAPA_554651
  folder_03_PAPX_541313
  folder_04_PAP_654123
folder2
  folder_20_PAP_413513
  folder_02_PAPD_521354
  folder_055_PAP_685413
  folder_100_PAP_132312
folder3
  folder_11_PAPE_5313351
  folder_32_PAP_3513131
  folder_53_PAP_3213321
  folder_84_PAP_3313213

..

次のコマンドを使用して、「を含むすべてのフォルダとサブフォルダを一覧表示します。肺高血圧「」と入力し、テキストファイル「list.txt」に保存します。

find -type d -name "*_PAP_" > list.txt

出力は次のとおりです。

  ./folder1/folder_01_PAP_515151
  ./folder1/folder_04_PAP_654123
  ./folder1/folder_20_PAP_413513
  ./folder2/folder_055_PAP_685413
  ./folder2/folder_100_PAP_132312
  ./folder3/folder_32_PAP_3513131
  ./folder3/folder_53_PAP_3213321
  ./folder3/folder_84_PAP_3313213

このリストから新しいフォルダを作成したいと思います。新しいフォルダーの名前には、「055_PAP」、「32_PAP」、「53_PAP」など、前のリストの「3桁_PAP」部分を含める必要があります。

 01_PAP
 04_PAP
 20_PAP
 055_PAP
 100_PAP
 32_PAP
 53_PAP
 84_PAP

答え1

ファイル(list次の内容を含む名前)があり、ファイルの各行名に対してディレクトリを作成する必要がある場合は、ディレクトリ名は./folder?/folder_

./folder1/folder_01_PAP_515151
./folder1/folder_04_PAP_654123
./folder2/folder_055_PAP_685413
./folder2/folder_100_PAP_132312
./folder3/folder_32_PAP_3513131
./folder3/folder_53_PAP_3213321
./folder3/folder_84_PAP_3313213

それではできます。

cat list | sed -r -e 's~[.]/folder[0-9]+/folder_~~' | xargs -I{} mkdir -p «prefix»{}

  • フォルダ番号を1つ以上の番号に設定しました。
  • プレフィックスが必要ない場合は、「プレフィックス」を空白にしてください。

ソースの内容を保持しながら、ソースフォルダ/ディレクトリの名前を変更するには、次の手順を実行できます。

これでテストしてみてください。次に、名前の変更から削除し、-n実際に実行します。

find . -type d -name "*_PAP_" | rename -n 's~[.]/folder[0-9]+/folder_~~'

rename検索パターンはと同じですsedrenameファイル名に適用され、sedファイルまたはストリームに適用されます。

オプションsed:

  • -r拡張正規表現(使用する正規表現の方言)を使用します。
  • -e次のパラメータは式(sedプログラム)です。
  • 's~[.]/folder[0-9]+/folder_~~'シェルが解釈されないように引用された式です。

この表現は以下を説明します。s~[.]/folder[0-9]+/folder_~~

  • s検索と置換
  • ~区切り文字は式をさまざまな部分に分割するため、どの文字でも使用できますが、毎回同じ文字を使用する必要があります。s~«search_for»~«replace_with»~«options»または別の文字を使用してくださいs@«search_for»@«replace_with»@«options»
  • «search_for»正規表現:
    • [.]一点
    • /folderまさにそれが言うことです。
    • [0-9]数字。
    • +1つ以上の先行原子(数字)(したがって1つ以上の数字)。
    • /folder_まさにそれが言うことです。
  • «replace_with»他のものに置き換えてください。この場合は何もありません。
  • この場合は、「オプション」を参照してください。他のオプションにはi大文字と小文字を無視することが含まれており、g複数回実行してください(最初の文字列のみを検索するのではありません)。

sed/言語はrename複雑ですが、非常に強力です。あなたが使用する主なものはs(ここで使用されているように)おそらくnextでありy、それらは学ぶ価値があります。また、正規表現(grepや他のコマンドにも使用されます)を学ぶ必要があります。

関連情報