如何根据文件名中的时间戳复制一系列文件?
How can I copy a range of files depending on a timestamp in the filename?
OS 是 Raspberian - linux - Bash.
我正在尝试根据文件名中的时间戳和从目录 A 到目录 B 的标签复制选择的文件。
文件名格式为:
固定文本:DCS-932L
时间戳:YYYYMMDDhhmmssnn
标签_day
或_night
或_light_is_on
固定文本:.jpg
例如:
DCS-932L2019103013414701_day.jpg
DCS-932L2019111505255401_night.jpg
DCS-932L2019112319413501_light_is_on.jpg
如何在 2 个给定时间戳之间复制特定范围的文件,如果可能,使用一个或多个给定标签?
我想这可以通过 find
或 rsync
结合 RegEx 来完成。但这太复杂了,我无法理解。
对于简单的时间范围,您可以使用 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"
Globbing 也适用于标签。
DCS-932*_day.jpg # all files with _day label
DCS-932L2019*{_day,_night}.jpg # all files from 2019 with _day or _night label
对于任意范围,您必须手动过滤文件。这可以通过循环来完成。循环可以与 globbing 结合使用以加快进程或 select 仅某些标签。
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
给定大量文件,并行处理和发出少量 '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}" ' > FROM && < TO' |
xargs -L50 cp -t target/dir
这将使用 find 来定位文件,使用 awk 来过滤,并使用 xargs 来对它们进行分组,以最大限度地减少 cp 调用的次数。
理论上可以运行并行复制(xargs -P4等),但需要实际测试。
OS 是 Raspberian - linux - Bash.
我正在尝试根据文件名中的时间戳和从目录 A 到目录 B 的标签复制选择的文件。
文件名格式为:
固定文本:
DCS-932L
时间戳:YYYYMMDDhhmmssnn
标签
_day
或_night
或_light_is_on
固定文本:
.jpg
例如:
DCS-932L2019103013414701_day.jpg
DCS-932L2019111505255401_night.jpg
DCS-932L2019112319413501_light_is_on.jpg
如何在 2 个给定时间戳之间复制特定范围的文件,如果可能,使用一个或多个给定标签?
我想这可以通过 find
或 rsync
结合 RegEx 来完成。但这太复杂了,我无法理解。
对于简单的时间范围,您可以使用 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"
Globbing 也适用于标签。
DCS-932*_day.jpg # all files with _day label
DCS-932L2019*{_day,_night}.jpg # all files from 2019 with _day or _night label
对于任意范围,您必须手动过滤文件。这可以通过循环来完成。循环可以与 globbing 结合使用以加快进程或 select 仅某些标签。
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
给定大量文件,并行处理和发出少量 '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}" ' > FROM && < TO' |
xargs -L50 cp -t target/dir
这将使用 find 来定位文件,使用 awk 来过滤,并使用 xargs 来对它们进行分组,以最大限度地减少 cp 调用的次数。
理论上可以运行并行复制(xargs -P4等),但需要实际测试。