shell - 将“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
我想用这个命令实现的是:
- 查找(递归)我不可写的所有目录
- 列出这些不可写目录的直接子文件
- 使用这些文件获取长列表格式
ls -l <filename>
- 将此输出存储在文件中,以便稍后我可以在其上运行 python 脚本以获取所有已识别文件的总大小
我这样做的原因是要识别共享服务器上的所有文件,如果我尝试过,我无法删除这些文件。如果有更好的方法来实现这个目标,也请告诉我......
非常感谢!
解决方案
您不应该遇到错误,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
推荐阅读
- angular - 可观察的订阅返回值
- c++ - 确定字符串是否包含日期和时间
- sql - SQL 必须声明标量变量“@UnitList”
- python - 从 Pandas 数据框加载 Keras 中的批量图像
- vba - 切换显示/隐藏工作表
- oracle - 如何在 pl/sql 过程中使用游标返回多行多列?
- c# - 如何编写正则表达式以将 HEX 值与变量声明匹配?
- android - 如何在 RecyclerView 滚动时显示或隐藏视图
- ruby-on-rails - How to access model from two distinct foreign keys?
- excel - Power BI DAX 表