linux - xargs 并查找,rm 提示文件名中的\n(换行符)

标签 linux bash xargs

我正在尝试使用 Debian 中的脚本删除树中最旧的文件。

find /home/backups -type f \( -name \*.tgz -o -name \*.gz \) -print0 | xargs -0 ls -t | tail -1 | xargs -0 rm

但是我得到一个错误:

rm: cannot remove `/home/backups/tree/structure/file.2011-12-08_03-01-01.sql.gz\n': No such file or directory

任何想法我做错了什么(或者有更简单/更好的方法吗?),我尝试过 RTFM,但迷路了。

最佳答案

ls 附加一个换行符,最后一个 xargs -0 表示换行符是文件名的一部分。 使用 -d '\n' 而不是 -0 运行最后一个 xargs。

顺便说一句,由于 xargs 的工作方式,您的整个管道都是一个等待发生的错误。考虑由 find 生成的非常长的文件名列表,以便 xargs -0 ls 使用文件名的子集多次运行 ls。只有最老的last ls 调用 才能通过tail -1。如果最旧的文件实际上是 find 输出的第一个文件名,那么您正在删除一个较新的文件。

关于linux - xargs 并查找,rm 提示文件名中的\n(换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8519219/

相关文章:

linux - 聚合行和求和列

linux - 捕获/dev/tty0 输出到文件

linux - shell 中的备份脚本

linux - Bash 数量限制?

linux - 在共享主机站点上创建额外的 cpanel 管理员

linux - 比较两个文件并应用差异

linux - 外包bash shell脚本函数

linux - 在被定界符分割的文件的每一行上将 Bash 脚本添加到 mkdir?

bash - xargs 不会在 aws cli 输出中的空格上进行分割

linux - 如何在单个 CLI 命令中通过 ssh 重启多台远程机器