首页 > 解决方案 > 使用 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");}}'

标签: shellxargs

解决方案


更具体地说,我想删除 Build 中未列出的 *.cpp 文件

您想要commjoin将两个排序列表连接在一起。我总是混合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) | ...

不要解析 `ls

<(...)是 bash 特定的进程替换。在非 bash shell 中,只需创建一个带有进程输出的临时文件。


推荐阅读