bash - 系统中最大的文件并在 unix 中移动
问题描述
我是 bash 新手,我正在为此苦苦挣扎。我有一个任务,问题是
尝试找到整个文件系统中按大小排序的前 5 个较大的文件,并将文件移动到 /tmp 文件夹并使用当前日期时间格式重命名文件
我尝试使用以下代码
du -a /sample/ | sort -n -r | head -n 5
我得到列表,但我无法移动..
请提出建议
解决方案
看起来像一个简单的xargs案例:
du -a /sample/ | sort -n -r | head -n 5 | xargs -I{} mv {} /tmp
xargs
在这种情况下,这里只是从标准输入中读取行并将它们作为参数附加到命令mv
中。因为-I{}
指定了 ,{}
所以参数的字符串被替换为xargs
。所以mv {} /tmp
被执行为mv <the first file> /tmp
等等mv <the second file> /tmp
。你可以前。添加-t
选项到xargs
或前。添加echo
以查看发生了什么:xargs -I{} -t echo mv {} /tmp
。
mv
我们可以在流的末尾添加 /tmp 并只运行一个命令,而不是运行 5 个进程:
{ du -a /sample/ | sort -n -r | head -n 5; echo /tmp; } | xargs mv
或喜欢:
du -a . | sort -n -r | head -n 5 | { tee; echo /tmp; } | xargs mv
请注意,使用du -a
很可能不适用于带有特殊字符、空格、制表符和换行符的文件名。它还将在其输出中包含目录。如果您只想过滤文件,请移至更安全find
:
find /sample/ -type f -printf '%s\t%p\n' | sort -n -r | cut -f2- | head -n5 | xargs -I{} mv {} /tmp
首先,我们打印每个文件名及其大小(以字节为单位)。然后我们对流进行数字排序。然后我们删除大小,即。'\t'
在第一个列表中切断流。然后我们得到head -n5
线条。最后,我们用xargs
. 它适用于文件名中没有特殊字符的文件名,例如不可读的字节、空格、换行符和制表符。
对于这种极端情况,最好使用find
和处理以零结尾的字符串,如下所示(只需注意-z
并-0
添加选项):
find /sample/ -type f -printf '%s\t%p\0' | sort -z -n -r | cut -z -f2- | head -z -n5 | xargs -0 -I{} mv {} /tmp
推荐阅读
- php - 检查PHP数组中的数组索引是否为1
- react-native - React 原生 index.js 并导入 react
- java - 重复 getter 调用的性能与将值保存在局部变量中
- mysql - 如何使用 MySQL Workbench 保存视频文件
- php - 无法使用 phpseclib v2.x 对 SFTP 服务器进行身份验证 - 未报告错误
- python - SQLAlchemy JOIN 和不明确的列名
- python - 当 Chrome 浏览器工作时,Web Scraper 返回空的 html 文件;已经尝试过 UserAgent
- c - 如何打印数组中包含的结构元素
- cql - 我如何使用 CQL 过滤器 [attr IN List ]?
- android - 为什么 SQLite 在我的 Android Studio 中不起作用?