grep是否可以使用数组作为模式?

时间:2019-06-13 18:07:25

标签: bash grep

TL; DR 如何使用grep过滤ls / find输出 用数组作为模式?

背景故事: 我有一个管道,必须重新运行才能遇到错误的数据集。 哪些数据集发生错误将保存在制表符分隔的文件中。 我想删除管道出错的文件。

为此,我从另一个包含完成的数据集的文件中提取了数据集名称,并将其保存在bash数组{ds1 ds2 ...}中,但是现在我被困住了,因为我无法弄清楚如何排除数组中的数据集从我的删除步骤开始。

这是文件夹结构(X = 1-30): 数据集/dsX/results/dsX.tsv

不排除完成的数据集,这意味着删除失败的和完成的数据集的文件夹就像一个超级按钮

#1. move content to a trash folder
ls /datasets/*/results/*|xargs -I '{}' mv '{}' ./trash/

#2. delete the empty folders
find /datasets/*/. -type d -empty -delete

但是由于我想排除完成的数据集,所以我认为将它们保存在数组中会很聪明:

#find finished datasets by extracting the dataset names from a tab separated log file
mapfile -t -s 1 finished < <(awk '{print $2}' $path/$log_pf)
echo ${finished[@]}

可以按预期工作,但现在我只能使用该数组过滤ls输出: *伪代码

#trying to ignore the dataset in the array - not working
ls -I${finished[@]} -d /datasets/*/
#trying to reverse grep for the finished datasets - not working
ls /datasets/*/ | grep -v {finished}

您如何看待我目前的想法? 仅使用bash可能吗?我想在python中我可以轻松做到这一点 但出于培训目的,我想用bash来做。

2 个答案:

答案 0 :(得分:3)

grep可以使用-f选项从文件中获取模式。请注意,包含换行符的文件名会引起问题。

如果您需要以某种方式处理输入,则可以使用过程替换:

grep -f <(process the input...)

答案 1 :(得分:1)

我必须承认我对您正在做的事情感到困惑,但是如果您只是尝试生成文件列表(不包括存储在其他文件第2列中的文件),并且您的文件/目录名称不能包含空格那应该是:

find /datasets -type f | awk 'NR==FNR{a[$2]; next} !($0 in a)' "$path/$log_pf" -

如果这还不是您所需要的,请编辑您的问题以阐明您的要求,并添加简洁的可测试样本输入和预期输出。