我的所有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 command。
编辑:正如@DennisWilliamson指出(并且还查看当前的手册页)重新-i
选项This option is deprecated; use -I instead.
。
此外,所提供的两种解决方案都取决于问题中的文件名不包含任何空格或制表符。
cp
似乎理解反击命令。所以你可以使用像这样的命令将10个最新文件复制到另一个文件夹,例如/test
:
cp `ls -t *.htm | head -10` /test