【发布时间】:2018-11-20 23:16:17
【问题描述】:
我想从当前目录复制一系列类似的文件到目标目录,当前目录下的文件有:
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0001_ux.hst
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0001_uz.hst
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0002_ux.hst
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0002_uz.hst
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0003_ux.hst
prod07_sim0500-W31-0.2_velocity-models-2D_t80_f0003_uz.hst
其中sim 是从sim0001 到sim0500 和f 是从f0001 到f0009。我只需要f0002、f0005 和f0008。我写了以下代码:
target_dir="projects/data"
for i in {0001..0500}; do
for s in f000{2,5,8}; do
files="[*]$i[*]$s[*]"
cp $files target_dir
done
done
我对 Shell 非常陌生,想知道如何编写 $files="[*]$i[*]$s[*]"$,以便它只能匹配 f0002、f0005 和 f0008。我也使用for i in {0001..0500}; do 的原因是文件太大,我想确保我可以在开始时访问一些已完成的文件(例如,包括所有 sim0001)。
编辑:将for s in f0002 f0005 f0008; do 更改为f000{2,5,8}。
【问题讨论】:
-
cp *sim0[0-5][0-9][0-9]-*_f000[258]_* /target/怎么样?当然,根据需要填写 glob...如果您的文件多于ARG_MAX,可能会出错,但我认为不需要循环。 (是的,我知道这也与 sim0000 匹配。如果这是一个问题,请将其拆分为两个命令。与嵌套循环相比,打字和头痛仍然更少。)