TL; DR
Как отфильтровать вывод ls / find с помощью grep
с массивом в качестве шаблона?
Фоновая история:
У меня есть конвейер, который я должен повторно запустить для наборов данных, которые сталкиваются с ошибкой.
Какие наборы данных встречаются с ошибкой, сохраняется в файле с разделителями табуляции.
Я хочу удалить файлы, в которых конвейер столкнулся с ошибкой.
Для этого я извлек имена наборов данных из другого файла, содержащего законченный набор данных, и сохранил их в массиве bash {ds1 ds2 ...}, но теперь я застрял, потому что не могу понять, как исключить наборы данных в массиве из моего шага удаления.
Это структура папок (X = 1-30):
наборы данных / DSX / результаты / 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.