【问题标题】:How can I copy a range of files depending on a timestamp in the filename?如何根据文件名中的时间戳复制一系列文件?
【发布时间】:2020-03-20 00:04:50
【问题描述】:

操作系统是 Raspberian - linux - Bash。

我正在尝试根据文件名中的时间戳和从目录 A 到目录 B 的标签复制文件选择。

文件名格式为:

  1. 固定文本:DCS-932L

  2. 时间戳:YYYYMMDDhhmmssnn

  3. 标签_day_night_light_is_on

  4. 固定文本:.jpg

例如:

  • DCS-932L2019103013414701_day.jpg
  • DCS-932L2019111505255401_night.jpg
  • DCS-932L2019112319413501_light_is_on.jpg

如何在 2 个给定的时间戳之间复制一定范围的文件,如果可能的话,复制一个或多个给定的标签?

我想这可以通过 findrsync 与 RegEx 结合来完成。但这太复杂了,超出了我的想象。

【问题讨论】:

  • 预计要选择多少个文件?对于大量文件,尽量减少 cp/rsync 调用的数量可能很重要。
  • 这将是大约 3000 个文件。

标签: bash timestamp copy range filenames


【解决方案1】:

对于简单的时间范围,您可以使用 bash 的 globbing。您可能想要激活shopt -s nullglob
一些例子:

cp  DCS-932L2019*.jpg          target/dir/  # range = "in 2019"
cp  DCS-932L201911*.jpg        target/dir/  # range = "in november 2019"
cp  DCS-932L2019110*.jpg       target/dir/  # range = "from 2019-11-01 to 2019-11-09"
cp  DCS-932L2019{04..12}*.jpg  target/dir/  # range = "from 2019-04-01 to 2019-12-31"

通配符也适用于标签。

DCS-932*_day.jpg                # all files with _day label
DCS-932L2019*{_day,_night}.jpg  # all files from 2019 with _day or _night label

对于任意范围,您必须手动过滤文件。这可以通过循环来完成。循环可以与 globbing 结合使用以加快处理速度或仅选择一些标签。

prefix=DCS-932
for file in "$prefix"*.jpg; do
    withoutPrefix="${file/$prefix/}"
    timestamp="${withoutPrefix/_*/}"
    # replace YYYYM... with your range
    (( timestamp > YYYYMMDDhhmmss )) && 
    (( timestamp < YYYYMMDDhhmmss )) &&
    cp "$file" target/dir/
done

【讨论】:

  • 谢谢。明天我会调查的
【解决方案2】:

考虑到大量文件,对于提高并行处理效率和发出少量“cp”调用可能很重要。结合find/awk/xargs/cp:

from=...  # Timestamp ni YYYYMMDDhhmmss
to=...    # Timestamp in YYYYMMDDhhmmss
prefix=DCS-932
find . -name "${prefix}*.jpg" |
    awk -v "FROM=${prefix}${from}" -v TO="${prefix}${to}" '$1 > FROM && $1 < TO' |
    xargs -L50 cp -t target/dir

这将使用 find 定位文件,使用 awk 进行过滤,并使用 xargs 对它们进行分组以最小化 cp 调用次数。

理论上可以并行运行副本(xargs -P4等),但需要实际测试。

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多