将三个最新文件复制到一个目录(递归)到另一个指定目录

时间:2010-10-21 21:37:05

标签: linux bash

我正在使用bash。

假设我有一个日志文件目录/var/myprogram/logs/

在这个目录下,我有很多子目录和子子目录,包括我程序中不同类型的日志文件。

我想在2010下找到三个最新文件(最近修改过的),其名称以/var/myprogram/logs/开头,与子目录无关,并将它们复制到我的主目录。< / p>

这是我手动做的事情 1.浏览每个目录并执行ls -lt 2010* 查看最近修改了以2010开头的文件。
2.一旦我浏览了所有目录,我就知道哪三个文件是最新的。所以我将它们手动复制到我的主目录。

这是非常繁琐的,所以我想知道是否可能以某种方式将一些命令组合在一起来执行此操作,最好不使用shell脚本?

我一直在研究findlsheadawk我可以使用但是没有找到正确的粘合方法他们在一起。

如果需要澄清,请告诉我。感谢。

3 个答案:

答案 0 :(得分:1)

以下是您可以这样做的方法:

 find -type f -name '2010*' -printf "%C@\t%P\n" |sort -r -k1,1 |head -3 |cut -f 2-

这将输出以上次更改时间为前缀的文件列表,根据该值对其进行排序,取前3并删除时间戳。

答案 1 :(得分:1)

你的答案感觉非常复杂,怎么样

find . -type d中的文件; do ls -t -1 -F $ FILE | grep -v“/”|头-n3 | xargs -I {} mv {} ..;完成的;

或布置得很好

  for FILE in `find . -type d`; 
  do
      ls -t -1 -F $FILE | grep -v "/" | grep "^2010" | head -n3 | xargs -I{} mv {} ~;
  done;

答案 2 :(得分:0)

快速入侵后我的“最短”答案。

for file in $(find . -iname *.php -mtime 1 | xargs ls -l | awk '{ print $6" "$7" "$8" "$9 }' | sort | sed -n '1,3p' | awk '{ print $4 }'); do cp $file ../; done

存储在$()中的主命令执行以下操作:

  1. Find递归当前目录中的所有文件(不区分大小写)名称* .php并且在过去24小时内已被修改。

  2. 管道到ls -l,需要能够按修改日期排序,所以我们可以有前三个

  3. 使用awk

  4. 提取修改日期和文件名/路径
  5. Sort这些基于日期时间的文件

  6. sed仅打印前3个文件

  7. awk仅打印其姓名/路径

  8. 在for循环中使用,并将其复制到所需位置。

  9. 或者使用@ Hasturkun的变体,在我编辑这篇文章时弹出作为回复:)

相关问题