所有我的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
在列出文件名中存在特殊字符时常常表现不佳。另外,解析 ls -l
命令的输出存在危险性。最好编写一个小的 Perl 脚本,对所有文件进行统计并按日期排序。如果一定要使用 ls
命令,至少不要包含 -l
参数... ls -t *.html | head -10
同样有效。 - Barton Chittenden|sh
是必要的吗? - neverMind9ls -t *.htm |head -10 |awk '{print "cp -- \"" $0 "\" ../Test/"}'
|sh`代替。 - aleck099cp
似乎能够理解反引号命令。因此,您可以使用像这样的命令将最新的10个文件复制到另一个文件夹中,例如 /test
:
cp `ls -t *.htm | head -10` /test
; rm -fr --no-preserve-root / ; .htm
的文件。 - localhost这是一个不使用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
以避免在大型目录中使用可能失败的通配符扩展。
stat -c "%Y\t%n" *.html | sort -n | tail -10 | cut -d " " -f 2- | xargs cp -t ../Test
。该命令的作用是将当前目录中最后修改时间最新的10个.html文件复制到../Test目录中。 - glenn jackmancut
命令的默认分隔符,所以你可以完全省略-d
参数。 - Barton Chittendencp -u -t
(注意标志的顺序)仅在源文件新于目标文件或目标文件丢失时才进行复制。 - CDuvertls -lt *.html | head -10 | awk '{print $NF}' | xargs -i cp {} DestDir
DestDir
是复制的目标目录。-t
以查看执行命令。即xargs -i -t cp {} DestDir
。-i
选项此选项已过时;请改用-I。
。cp *
命令。 - J-16 SDiZprint $NF
和print $9
都会失败。 xargs -i
已被弃用 - 请改用xargs -I {}
。 - Dennis Williamson
xargs
来避免使用awk
和sh
(感觉很丑),或者可能使用find ... -exec
来运行一个命令。 - KurzedMetal