Shell,复制具有相似名称的文件

时间:2018-11-20 23:16:18

标签: bash shell glob

我想将一系列相似的文件从当前目录复制到目标目录,当前目录下的文件是:

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

其中simsim0001sim0500,而ff0001f0009。我只需要f0002f0005f0008。我编写以下代码:

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[*]"$,以便它只能匹配f0002f0005f0008。我之所以也使用for i in {0001..0500}; do的原因是文件太大,我想确保一开始就可以访问一些完成的文件(例如,包括所有sim0001)。

编辑:将for s in f0002 f0005 f0008; do更改为f000{2,5,8}

1 个答案:

答案 0 :(得分:3)

您需要的是globbing和有些不同的quoting

cp *"$i"*"$s"* "$target_dir"

不将其存储在变量中是有意的-更快,更安全。如果最终出现如此大的文件列表,您开始遇到系统限制,则必须研究xargs