仅将目录中的最后8个文件移动到另一个目录

我正在尝试将最后8个文件从Documents目录移动到另一个目录,但我不想将它们逐个移动到该特定目录。 是否可以使用tail命令的替代来移动它们,但对于目录而不是文件? 我的意思是我想用tail -8 ./Documents | mv ./Anotherdirectory tail -8 ./Documents | mv ./Anotherdirectorymv tail -8 ./Documents ./Anotherdirectory

事实上,我正在寻找一种聪明的方法,我可以快速移动最后8个文件(如ls所列)(无需键入每个名称)到另一个目录。 有什么建议?

您可以使用for ,以有序的方式循环遍历文件,并允许我们避免解析findls的输出,以避免文件名中的空格和其他特殊字符的问题。 非常感谢@muru提高了这个:)

 i=0; j=$(stat ~/Documents/* --printf "%i\n" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done 

首先使用echo测试它,然后删除echo以实际移动文件。

作为一个脚本:

 #!/bin/bash i=0 j=$(stat ~/Documents/* --printf "%i\n" | wc -l ) for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v -- "$k" ~/AnotherDirectory fi done 

再次,在测试后删除echo以移动文件为真

说明

  • i=0告诉shell开始迭代0
  • j=$(stat ~/Documents/* --printf "%i\n" | wc -l )这是将变量j设置为等于目录中文件总数的整数。 感谢Serg回答我自己关于如何可靠地计算文件的问题,无论他们的名字包含什么字符
  • do if (( (j - ++i) < 8 ))对于循环的每次迭代,测试j的结果减去循环运行的次数是否小于8,如果是
  • mv -v -- "$k" ~/AnotherDirectory将文件移动到新目录

您可以使用命令替换来执行此类操作。 在Bash:

 mv $(ls -d [sort options] source/* | tail -n8) destination 

$(command)将运行其中包含的任何内容,并将文本输出替换为外部命令。 该ls命令将打印源目录中每个文件的路径,这些文件按照您指定的标志排序,每行一个,因此tail可以采用最后几个。 因此,上述内容将扩展至

 mv source/file1 source/file2 source/file3 ... source/file8 destination 

你可以运行ls -d [sort options] source/* | tail -n8 ls -d [sort options] source/* | tail -n8查看它将复制哪些文件。

根据您对ls输出和文件命名的排序方式,您可以更简单地使用mv source/name_* destination某些变体来复制以“name_”开头的所有内容,从而实现您正在寻找的内容。目标目录。

编辑:当文件名中有空格时,上面的中断。 解决这个问题的更复杂的替代方案是

 ls -d1 [sort options] source/* | tail -n8 | tr '\n' '\0' | xargs --null mv -t destination 

虽然它仍然使用解析ls输出来按任何不按字母顺序排列的顺序进行排序。

类似于t-mager的建议,您可以使用ls排序选项并将最后8个文件放入列表中,这些是您的文件:

1 10 2 3 4 5 6 7 8 9

使用以下命令:
for n in `ls|tail -8`; do mv $n ~/temp; done