我的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.
。
另外,这两个解决方案都依赖于文件名中的问题不包含任何空格或制表符。