如何根据文件名中的时间戳复制一系列文件?

问题描述 投票:0回答:2

操作系统是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结合使用。但这是如此复杂,令人难以置信。

bash timestamp copy range filenames
2个回答
0
投票

对于简单的时间范围,您可以使用bash的globing。您可能需要激活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"

Globing也适用于标签。

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

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

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

0
投票

给出大量文件,可能对于提高并行处理效率和发出少量'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等),但需要实际测试。

© www.soinside.com 2019 - 2024. All rights reserved.