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

我的HTML文件驻留在这里:

/home/thinkcode/myfiles/html/ 

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

我有这个到目前为止。 请纠正我 我正在寻找一个单线!

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

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

这是一个不使用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的初始使用,以避免使用可能在大目录中失败的通配符扩展。

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

在上面的例子中, DestDir是复制的目标目录。

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

有关更多信息,请查看xargs命令 。

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

另外,这两个解决方案都依赖于文件名中的问题不包含任何空格或制表符。