grep 特定文件并复制这些特定文件

grep 特定文件并复制这些特定文件

这些是我的文件,其输出是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 来实现您想要的功能,而不必依赖其他命令,例如grepfind。这包括时间戳为 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

这是使用eglob 限定符根据某些代码的评估结果来选择文件e(要考虑的文件位于变量中$REPLY)。这里对文件名的最后 8 个字符进行字符串比较,选择以 11:30:00 到 12:30:59 结尾的文件。

相关内容