如何将前10个最新文件从一个目录复制到另一个目录?

时间:2012-05-15 15:50:45

标签: linux awk copy ls

我的html文件位于此处:

/home/thinkcode/myfiles/html/

我想将最新的10个文件移至/home/thinkcode/Test

到目前为止,我有这个。请指正。我正在寻找一个单行!

ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh

4 个答案:

答案 0 :(得分:10)

ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh

答案 1 :(得分:6)

这是一个不使用ls的版本。它应该不易受文件名中的奇怪字符的影响:

find . -maxdepth 1 -type f -name '*.html' -print0 
     \| xargs -0 stat --printf "%Y\t%n\n" 
     \| sort -n 
     \| tail  -n 10 
     \| cut -f 2 
     \| xargs cp -t ../Test/

我使用find有几个原因:

1)如果目录中的文件太多,bash将会忽略通配符扩展*。

2)使用-print0参数find解决了bash将文件名中的空格扩展为多个标记的问题。

*实际上,bash为其通配符扩展及其环境变量共享内存缓冲区,因此它不是文件名数量的函数,而是文件名和环境变量的总长度。环境变量太多=>没有通配符扩展。

编辑:纳入了@ glennjackman的一些改进。保留find的初始使用,以避免使用可能在大目录中失败的通配符扩展。

答案 2 :(得分:5)

ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir

在上面的示例中,DestDir是副本的目标目录。

在xargs之后添加-t以查看执行时的命令。即,xargs -i -t cp {} DestDir

有关详细信息,请查看xargs command

编辑:正如@DennisWilliamson所指出的那样(并且还检查了当前的手册页)重新-i选项This option is deprecated; use -I instead.

此外,所提供的两种解决方案都取决于问题中的文件名不包含任何空格或标签。

答案 3 :(得分:2)

cp似乎了解反引号命令。因此,您可以使用像这样的命令将最新的10个文件复制到另一个文件夹,例如/test

cp `ls -t *.htm | head -10` /test