Как удалить файлы из каталога с помощью 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
вариант.