铝我的HTML文件所在的位置:如何将前10个最新文件从一个目录复制到另一个目录?
/home/thinkcode/myfiles/html/
我要最新的10个文件移动到/home/thinkcode/Test
我有这个至今。请纠正我。我正在寻找一个单线!
ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh
铝我的HTML文件所在的位置:如何将前10个最新文件从一个目录复制到另一个目录?
/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'对于列出具有特殊字符的文件名是非常糟糕的。而且,解析'ls -l'的输出也是充满危险的。最好编写一个小的perl脚本,它将统计所有文件并按日期对结果进行排序。如果你必须使用'ls',至少应该放弃'-l'参数......'ls -t * .html |头-10“也可以工作。 –
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.
。
此外,这两种解决方案都依赖于文件名,不包含任何空格或制表符。
这是一个不使用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
的最初使用,以避免使用可能在大型目录中失败的通配符扩展。
+1不使用ls。可以更简单一点:'stat -c“%Y \ t%n”* .html | sort -n |尾-10 | cut -d“”-f 2- | xargs cp -t ../ Test' –
@glennjackman:是否在制表符处剪切,粘贴时打印为“”? – ToolmakerSteve
好点。它应该是'削减-d $“\ T” ...' –
您可以使用'xargs'并避免'awk' +'sh'(感觉很难看),或者可能使用'find ... -exec'并运行一个命令。 – KurzedMetal
我可以做的发现,但只是想知道如何使用awk做同样的事情! – ThinkCode
请参阅[BashFAQ/003](http://mywiki.wooledge.org/BashFAQ/003)和[BashFAQ/099](http://mywiki.wooledge.org/BashFAQ/099)。 –