マイコンピュータには個人データベースとファイルパスが保存されています。このデータは、次のように(非常に長い)区切りテキストファイルとして保存されます。
============
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
に以下のコードを使用してから、すべての人のためにすべてを一度にコピーしていますか?PATH
cp
NAMES
#!/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
============