Можно ли grep, используя массив в качестве шаблона? - PullRequest
3 голосов
/ 13 июня 2019

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.

Ответы [ 2 ]

3 голосов
/ 13 июня 2019

grep может получить шаблоны из файла, используя опцию -f. Обратите внимание, что имена файлов, содержащие переводы строк, вызовут проблемы.

Если вам нужно как-то обработать ввод, вы можете использовать подстановку процесса:

grep -f <(process the input...)
1 голос
/ 14 июня 2019

Должен признать, что я не совсем понимаю, что вы делаете, но если вы просто пытаетесь создать список файлов, кроме тех, которые хранятся в столбце 2 какого-либо другого файла, а имена ваших файлов / каталогов не могут содержать пробелов тогда это будет:

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

Если это не все, что вам нужно, отредактируйте ваш вопрос, чтобы уточнить ваши требования и добавить краткий тестируемый образец ввода и ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...