2012-05-15 35 views
6

铝我的HTML文件所在的位置:如何将前10个最新文件从一个目录复制到另一个目录?

/home/thinkcode/myfiles/html/ 

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

我有这个至今。请纠正我。我正在寻找一个单线!

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

您可以使用'xargs'并避免'awk' +'sh'(感觉很难看),或者可能使用'find ... -exec'并运行一个命令。 – KurzedMetal

+0

我可以做的发现,但只是想知道如何使用awk做同样的事情! – ThinkCode

+3

请参阅[BashFAQ/003](http://mywiki.wooledge.org/BashFAQ/003)和[BashFAQ/099](http://mywiki.wooledge.org/BashFAQ/099)。 –

回答

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

'ls'对于列出具有特殊字符的文件名是非常糟糕的。而且,解析'ls -l'的输出也是充满危险的。最好编写一个小的perl脚本,它将统计所有文件并按日期对结果进行排序。如果你必须使用'ls',至少应该放弃'-l'参数......'ls -t * .html |头-10“也可以工作。 –

4
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.

此外,这两种解决方案都依赖于文件名,不包含任何空格或制表符。

+0

如何将文件复制到../test目录中? – ThinkCode

+0

ls -lt * .htm |头-10 | awk'{print $ NF}'| xargs cp * ../Test/?不起作用。如何从管道收集文件名并提供给复制命令? – ThinkCode

+0

它是'{}',而不是'*' –

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的最初使用,以避免使用可能在大型目录中失败的通配符扩展。

+3

+1不使用ls。可以更简单一点:'stat -c“%Y \ t%n”* .html | sort -n |尾-10 | cut -d“”-f 2- | xargs cp -t ../ Test' –

+0

@glennjackman:是否在制表符处剪切,粘贴时打印为“”? – ToolmakerSteve

+0

好点。它应该是'削减-d $“\ T” ...' –

相关问题