首页 > 解决方案 > 将“ls”命令的输出存储到文件中,同时忽略任何错误

问题描述

所以我在远程服务器上通过 ssh 运行命令,我需要存储该命令的所有输出,但是一旦遇到类似ls: cannot access '/downloads/something.txt': No such file or directory. 有没有办法在忽略任何错误的同时保持流程继续进行。如果我什至没有收到发生错误的通知也没关系,因为我知道这些只是少数文件(总共 16TB 中不到 100MB)。

这是我的命令:

find /downloads/ -type d ! -writable -print0 | xargs -0 -I{.} find {.} -maxdepth 1 -type f | xargs -I% ls -l % > myfile.txt

我想用这个命令实现的是:

  1. 查找(递归)我不可写的所有目录
  2. 列出这些不可写目录的直接子文件
  3. 使用这些文件获取长列表格式ls -l <filename>
  4. 将此输出存储在文件中,以便稍后我可以在其上运行 python 脚本以获取所有已识别文件的总大小

我这样做的原因是要识别共享服务器上的所有文件,如果我尝试过,我无法删除这些文件。如果有更好的方法来实现这个目标,也请告诉我......

非常感谢!

标签: shellunix

解决方案


您不应该遇到错误,ls: cannot access '/downloads/something.txt': No such file or directory因为您正在find使用ls. 你得到它们的原因是你的命令缺少一些-print0-0选项。也就是说,您可能应该将stderr前两个管道命令重定向到/dev/null,以防出现任何Permission denied错误。在这些更改之后,您的命令应如下所示:

find /downloads -type d ! -writable -print0 2>/dev/null | xargs -0 -I{.} find {.} -maxdepth 1 -type f -print0 2>/dev/null | xargs -0 -I % ls -l % > myfile.txt

此命令应该不会产生错误,但如果必须扫描 16TB 可能需要一段时间。

您可能还想尝试以下命令,看看它是否更快:

find /downloads -type d ! -writable -exec find {} -maxdepth 1 -type f -print0 \; 2>/dev/null | xargs -0 -I % ls -l % > myfile.txt

推荐阅读