仅将目录中的最后8个文件移动到另一个目录
我正在尝试将最后8个文件从Documents
目录移动到另一个目录,但我不想将它们逐个移动到该特定目录。 是否可以使用tail
命令的替代来移动它们,但对于目录而不是文件? 我的意思是我想用tail -8 ./Documents | mv ./Anotherdirectory
tail -8 ./Documents | mv ./Anotherdirectory
或mv tail -8 ./Documents ./Anotherdirectory
。
事实上,我正在寻找一种聪明的方法,我可以快速移动最后8个文件(如ls
所列)(无需键入每个名称)到另一个目录。 有什么建议?
您可以使用for
,以有序的方式循环遍历文件,并允许我们避免解析find
或ls
的输出,以避免文件名中的空格和其他特殊字符的问题。 非常感谢@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