San*_*oss 7 command-line files directory tail mv
我试图将最后 8 个文件从Documents目录移动到另一个目录,但我不想将它们一个一个地移动到该特定目录。是否可以用tail命令的替代品移动它们,但移动目录而不是文件?我的意思是我想用类似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
Run Code Online (Sandbox Code Playgroud)
首先使用 进行测试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
Run Code Online (Sandbox Code Playgroud)
再次,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 将文件移动到新目录