【问题标题】:Shell, copy files with similar namesShell,复制名称相似的文件
【发布时间】: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 是从sim0001sim0500f 是从f0001f0009。我只需要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}

【问题讨论】:

  • cp *sim0[0-5][0-9][0-9]-*_f000[258]_* /target/ 怎么样?当然,根据需要填写 glob...如果您的文件多于ARG_MAX,可能会出错,但我认为不需要循环。 (是的,我知道这也与 sim0000 匹配。如果这是一个问题,请将其拆分为两个命令。与嵌套循环相比,打字和头痛仍然更少。)

标签: bash shell glob


【解决方案1】:

你需要的是globbing和有点不同的quoting

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

故意不将其存储在变量中 - 它更快且安全。如果您最终得到如此庞大的文件列表,开始遇到系统限制,您将不得不查看xargs

【讨论】:

  • 也许强调引用通配符并将其嵌入方括号中会分别将通配符转换为文字*。在获得实际通配符之前,您必须删除引号和方括号。
  • 链接的文章应该很好地解释这两个(以及更多)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2015-11-10
  • 2017-06-29
相关资源
最近更新 更多