我有个人数据库和存储在计算机上的文件路径。该数据保存为(非常长的)分隔文本文件,如下所示:
============
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
动态生成shell脚本:
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/"
然后运行该 shell 脚本。您可以将其合并到一个操作中:
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
============