这些是我的文件,其输出是ll | awk '{print $9}'
thread_dump_10-10-22_10:00:01*
thread_dump_10-10-22_10:05:01*
thread_dump_10-10-22_10:10:01*
thread_dump_10-10-22_10:15:01*
thread_dump_10-10-22_10:20:01*
thread_dump_10-10-22_10:25:01*
thread_dump_10-10-22_10:30:01*
thread_dump_10-10-22_10:35:01*
thread_dump_10-10-22_10:40:01*
thread_dump_10-10-22_10:45:01*
thread_dump_10-10-22_10:50:01*
thread_dump_10-10-22_10:55:01*
thread_dump_10-10-22_11:00:01*
thread_dump_10-10-22_11:05:01*
thread_dump_10-10-22_11:10:01*
thread_dump_10-10-22_11:15:01*
thread_dump_10-10-22_11:20:01*
thread_dump_10-10-22_11:25:01*
thread_dump_10-10-22_11:30:01*
thread_dump_10-10-22_11:35:01*
thread_dump_10-10-22_11:40:01*
thread_dump_10-10-22_11:45:01*
thread_dump_10-10-22_11:50:01*
thread_dump_10-10-22_11:55:01*
thread_dump_10-10-22_12:00:01*
thread_dump_10-10-22_12:05:01*
thread_dump_10-10-22_12:10:01*
thread_dump_10-10-22_12:15:01*
thread_dump_10-10-22_12:20:01*
thread_dump_10-10-22_12:25:01*
thread_dump_10-10-22_12:30:01*
thread_dump_10-10-22_12:35:01*
thread_dump_10-10-22_12:40:01*
thread_dump_10-10-22_12:45:01*
thread_dump_10-10-22_12:50:01*
thread_dump_10-10-22_12:55:01*
我的问题是将 11:30 到 12:30 之间的文件复制到某个文件夹。来源:/home/Downloads/thread_dumps
目的地:/home/test
答案1
使用find
命令并假设所有文件都遵循相同的模式(以小时结尾):
find /home/Downloads/thread_dumps \( -name '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' -o -name '*12:30:[0-5][0-9]*' \) -exec cp --target-directory=/home/test {} +
上面的命令将复制具有的文件12:30:??
(如果时间是 12:31 或更长,则该文件将不被考虑)
如果您不想要文件,12:30
那么您应该使用以下find
命令:
find /home/Downloads/thread_dumps \( -name '*11:[3-5][0-9]:*' -o -name '*12:[0-2][0-9]:*' \) -exec cp --target-directory=/home/test {} +
答案2
您可以使用 shell glob 来实现您想要的功能,而不必依赖其他命令,例如grep
或find
。这包括时间戳为 12:30 的文件:
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]* \
/home/Downloads/thread_dumps/thread_dump_10-10-22_12:[012]* \
/home/Downloads/thread_dumps/thread_dump_10-10-22_12:30* \
/home/test
请注意,这里的最后一个*
是通配符*
并且与您的文件似乎具有的尾随无关。
答案3
你可以简单地复制这些文件,匹配它们将是一个 shell glob:
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_11:[345]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:[12]?:?? /home/test
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_12:30:00 /home/test
我将它们作为三个命令放在一起,但是如果您愿意,您可以将所有三个源模式放入同一个cp
命令中,可以直接作为三个单独的参数,也可以使用{x,y,z}
大括号扩展组合起来,就像我在这里所做的那样:
# Assuming `bash` or `ksh`
cp /home/Downloads/thread_dumps/thread_dump_10-10-22_{11:[345]?:??,12:[12]?:??,12:30:00} /home/test
如果您不想包含 12:30 文件,请省略第三个命令(或模式)。
该[...]
组件与任何一个封闭的字符相匹配。匹配?
任何单个字符。 (您可能最熟悉的是*
,它匹配任意数量的零个或多个字符。)
答案4
和zsh
:
cp thread_dump_10-10-22_??:??:??(e['
[[ $REPLY[-8,-1] > 11:30 && REPLY[-8,-1] < 12:31 ]]']) /home/test
这是使用e
glob 限定符根据某些代码的评估结果来选择文件e
(要考虑的文件位于变量中$REPLY
)。这里对文件名的最后 8 个字符进行字符串比较,选择以 11:30:00 到 12:30:59 结尾的文件。