我正在尝试将最后 8 个文件从Documents
目录移动到另一个目录,但我不想将它们一个接一个地移动到该特定目录。是否可以用命令的替代品来移动它们tail
,但是对于目录而不是文件?我的意思是我想用类似tail -8 ./Documents | mv ./Anotherdirectory
或 的东西这样做mv tail -8 ./Documents ./Anotherdirectory
。
事实上,我正在寻找一种巧妙的方法,可以ls
快速(无需输入每个名称)将最后 8 个文件(如 中所列)移动到另一个目录。有什么建议么?
您可以使用
for
, 它以有序的方式循环文件,并允许我们避免解析find
or的输出ls
,以避免文件名中的空格和其他特殊字符出现问题。非常感谢@muru 改进了这一点:)首先使用 测试它
echo
,然后删除echo
以实际移动文件。作为脚本:
再次,
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 中:
将
$(command)
运行其中包含的任何内容并将文本输出替换为外部命令。该ls
命令将打印源目录中每个文件的路径,这些文件根据您指定的标志进行排序,每行一个,因此tail
可以只取最后几个。因此,上述内容将扩展为您可以运行
ls -d [sort options] source/* | tail -n8
以查看它将复制哪些文件。根据您对输出的排序
ls
和文件命名的方式,您可以更简单地执行您正在寻找的操作,只需使用 的一些变体mv source/name_* destination
将所有以“name_”开头的内容复制到目标目录。编辑: 当文件名中有空格时,上述中断。解决此问题的更复杂的替代方案是
尽管它仍然利用解析
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
我发现这也有效:
ls -1 [sort options] | tail -n2 | xargs -I {} -n 1 echo "mv \"{}\" ../t2/"
当然,必须去除回声:
ls -1 | tail -n2 | xargs -I {} -n 1 mv "{}" ../t2/
"{}"
可以替换为'{}'
实际上,作为最后的实验,删除(双)引号也可以。令人惊讶,但经过测试。