Как удалить файлы из каталога с помощью CSV в Bash

У меня есть 600 000+ изображений в каталоге. Имена файлов выглядят так:

1000000-0.jpeg
1000000-1.jpeg
1000000-2.jpeg
1000001-0.jpeg
1000002-0.jpeg
1000003-0.jpeg

Первое число является уникальным идентификатором, а второе число является индексом.

{unique-id}-{index}.jpeg

Как бы я загрузить unique-idнаходится в файле.CSV и удаляет каждый файл, уникальный идентификатор которого совпадает с уникальным идентификатором в файле.CSV?

Файл CSV выглядит так:

1000000
1000001
1000002

... или я могу разделить точкой с запятой, например, так (при необходимости):

1000000;1000001;1000002

3 ответа

Решение

Вы можете установить переменную IFS в ; и перебрать значения, считанные в массив:

#! /bin/bash
while IFS=';' read -a ids ; do
    for id in "${ids[@]}" ; do
        rm $id-*.jpg
    done
done < file.csv

Попробуйте запустить скрипт с echo rm ... Сначала убедитесь, что он делает то, что вы хотите.

Если в строке ровно один идентификатор, это покажет вам все соответствующие имена файлов:

ls | grep -f unique-ids.csv

Если этот список выглядит правильно, вы можете удалить файлы с помощью:

ls | grep -f unique-ids.csv | xargs rm

Предостережение: это быстрое и грязное решение. Это будет работать, если имена файлов будут называться так, как вы говорите. Остерегайтесь, это может быть легко обманным путем, если хитрый злоумышленник или незадачливый пользователь удалит неправильные вещи.

Вы могли бы использовать find а также sed:

find dir -regextype posix-egrep \
         -regex ".*($(sed 's/\;/|/g' ids.csv))-[0-9][0-9]*\.jpeg"

замещать dir с вашим поисковым каталогом, и ids.csv с вашим файлом CVS. Чтобы удалить файлы, которые вы могли бы включить -delete вариант.

Другие вопросы по тегам