shell - 使用 shell 列出列表中不存在的现有文件
问题描述
如何列出存在但不存在于列表中的文件?*.cpp
更具体地说,我想删除Build
. 像这样列出当前目录和文件中都Build
存在的文件:
ls *.cpp | xargs -I % bash -c 'grep % Build'
但是,以下行当然是不正确的:
ls *.cpp | xargs -I % bash -c 'grep -v % Build'
因此问题是:如何使用 shell 命令列出*.cpp
文件中不存在的文件?Build
我可以做这样的事情,这很丑陋:
ls *.cpp | perl -e 'while(<>){chomp;my $l=`grep $_ Build`;chomp $l;if(length $l==0){print("rm $_\n");}}'
解决方案
更具体地说,我想删除 Build 中未列出的 *.cpp 文件
您想要comm
或join
将两个排序列表连接在一起。我总是混合comm
争论,但我认为:
comm -23 <(find . -type f -name '*.cpp' | sort) <(sort Build) |
xargs -n '\n' echo rm
或者如果你想依赖文件名扩展:
shopt -s nullglob # at least
comm -23 <(printf "%s\n" *.cpp | sort) <(sort Build) | ...
这<(...)
是 bash 特定的进程替换。在非 bash shell 中,只需创建一个带有进程输出的临时文件。
推荐阅读
- azure - Device Twin IoT Hub - 从 Python 中的 JSON 获取标签
- php - 如何将特定记录链接到 PHP 表单以更新该记录?
- kubernetes - 在 Kind 上使用 Ingress 和 LoadBalancer 类型的服务
- python - 用于输入自动语音识别模型的不同格式(比特率)的音频数据
- quaternions - 使用带有 gl-matrix.js 的四元数进行简单旋转
- java - Thymeleaf:检索隐藏输入到控制器的值
- python - 如何用while循环解决这个问题
- javascript - 如何避免异步事件处理程序顺序混乱
- java - 如何将视觉添加到 JComponent
- google-cloud-platform - Google Cloud Run - 使用机密时无法部署新修订