12

我的所有 html 文件都驻留在此处:

/home/thinkcode/myfiles/html/

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

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

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

4 回答 4

11
ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh
于 2012-05-15T15:59:53.750 回答
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以避免使用可能在大目录中失败的通配符扩展。

于 2012-05-15T16:43:32.523 回答
6

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

cp `ls -t *.htm | head -10` /test
于 2019-02-27T17:11:28.837 回答
5
ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir

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

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

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

编辑:正如@DennisWilliamson 所指出的(并且还检查了当前的手册页)re the -ioption This option is deprecated; use -I instead.

此外,提出的两种解决方案都取决于问题中的文件名,不包含任何空格或制表符。

于 2012-05-15T15:55:57.790 回答