如何将前10个最新文件从一个目录复制到另一个目录?

Thi*_*ode 9 linux awk ls copy

我的html文件驻留在这里:

/home/thinkcode/myfiles/html/
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我有这个.请指正.我正在寻找一个单行!

ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh
Run Code Online (Sandbox Code Playgroud)

aph*_*hex 10

ls -lt *.htm | head -10 | awk '{print "cp " $9 " ../Test/"$9}' | sh
Run Code Online (Sandbox Code Playgroud)

  • 对于列出包含特殊字符的文件名,`ls`非常糟糕.另外,解析`ls -l`的输出充满了危险.最好编写一个小的perl脚本,它将统计所有文件并按日期对结果进行排序.如果你必须使用`ls`,至少不要使用`-l`参数...`ls -t*.html | 头-10`也可以正常工作. (6认同)

Bar*_*den 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/
Run Code Online (Sandbox Code Playgroud)

我使用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 ../测试` (3认同)

gil*_*des 6

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

cp `ls -t *.htm | head -10` /test
Run Code Online (Sandbox Code Playgroud)

  • 工作得很好,直到你有一个名称中带有空格的文件,或者更糟糕的是,一个名为 `; 的文件。rm -fr --no-preserve-root / ; .htm` 在您的文件夹中。 (2认同)

Lev*_*von 5

ls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:正如@DennisWilliamson所指出的(并且还检查当前的手册页)重新-i选择This option is deprecated; use -I instead..

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

  • 如果文件名包含空格或制表符,`print $ NF`和`print $ 9`都会失败.不推荐使用`xargs -i` - 改为使用`xargs -I {}`. (2认同)