grep はテキストファイルのエントリを分離し、他のコマンドに含めます。

grep はテキストファイルのエントリを分離し、他のコマンドに含めます。

マイコンピュータには個人データベースとファイルパスが保存されています。このデータは、次のように(非常に長い)区切りテキストファイルとして保存されます。

============
NAME: John
TIME: 12:31:25
PATH: ./a/b/v/c   #to some data related to the person
============
NAME: Jo
TIME: 11:21:11
PATH: ./c/s/d/f   #to some data related to the person 
============
NAME: Je
TIME: 10:51:15
PATH: ./q/n/h/l   #to some data related to the person
============

......  # very long list of entries in this format.

NAME各アイテムを含むフォルダを作成し、その中のすべてのアイテムをフォルダPATHにコピーしたいと思いますOUTPUT。コマンドのすべての人grepに以下のコードを使用してから、すべての人のためにすべてを一度にコピーしていますか?PATHcpNAMES

#!/bin/bash -f
source=PATH TO THIS TEXT DELIMITED FILE (log.log)
grep -o 'NAME.*' ./log.log | cut -f2- -d':'> ./name.log; 
grep -o 'PATH.*' ./log.log | cut -f2- -d':'> ./path.log; 
for i in $(cat ./name.log);do
mkdir ./${i};
    for ii in $(cat ./path.log); do 
(
      cp ${ii}/*.* ./${i}
done
)&
done

私はコーディングの経験がほとんどないので、このコードは複雑すぎると思います。これを単純化する方法についてのアドバイスが必要ですか?

ベストアンサー1

このように試してみることもできますね…

まずawk、動的に生成されたシェルスクリプトを使用します。

awk '
  /NAME:/ {
    name=gensub(/\"/, "", "g", substr($0, 7))
  }
  /PATH:/ {path=$2}
  name && /=====/ {
    printf "mkdir \"%s\"\n", name
    printf "rsync -a \"%s/\" \"%s/\"\n", path, name
  }
'

あなたの入力に応じて、以下が生成されます。

rsync -a "./a/b/v/c/" "John/"
rsync -a "./c/s/d/f/" "Jo/"
rsync -a "./q/n/h/l/" "Je/"

次に、シェルスクリプトを実行します。これを1つのタスクにまとめることができます。

awk '
  /NAME:/ {
    name=gensub(/\"/, "", "g", substr($0, 7))
  }
  /PATH:/ {path=$2}
  name && /=====/ {
    printf "mkdir \"%s\"\n", name
    printf "rsync -a \"%s/\" \"%s/\"\n", path, name
  }
'

ここでは、コンテンツをコピーするために使用していますが、rsyncもちろんcp -r

また、あなたのコードから*.*

修正する

動作するように修正しました。

============
NAME: "John Frederick"
TIME: 12:31:25
PATH: ./a/b/v/c   #to some data related to the person
============

おすすめ記事