У меня есть 2 папки, одна из которых содержит файлы изображений, а вторая содержит текстовые файлы, каждый текстовый файл имеет то же имя, что и файл изображения, и содержит информацию об изображении. Для изображений, у которых нет текстового файла (в этом примере: 4.jpg, 5.jpg), я нашел способ определения различных файлов, но не могу их удалить.
diff <(ls -1 ./Images | sed s/.jpg//g) <( ls -1 ./Labels | sed s/.txt//g)
Вот маленький сценарий удара, который может помочь Вам решить эту задачу:
#!/bin/bash
for file in Images/*.jpg
do
if [[ ! -f "Labels/$(basename ${file%.*}).txt" ]]
then
echo rm "$file"
fi
done
echo
сделать фактические изменения.Сценарий должен быть выполнен в родительском каталоге, здесь он отформатирован как встроенная команда:
for f in Images/*.jpg; do if [[ ! -f "Labels/$(basename ${f%.*}).txt" ]]; then echo rm "$f"; fi; done
Я думаю, что сделал бы это как это:
for i in Images/*; do file=`echo $i | sed -e 's/jpg/txt/' -e 's/Images/Labels/'`; if [ ! -f "$file" ] ; then rm $i ; fi; done
Если Вы хотите удостовериться, что это работает, прежде на самом деле использовать его пробуют это сначала:
for i in Images/*; do file=`echo $i | sed -e 's/jpg/txt/' -e 's/Images/Labels/'`; if [ ! -f "$file" ] ; then echo rm $i ; fi; done
Это покажет, какие команды будут выполняться.
cd /path/to/Images
LIST=$(find /path/to/Labels -iname *.txt -printf "%f|" | sed 's/.txt/.jpg/g')
rm -i !($LIST)
txt
файлы.jpg
.Удаляет что-либо, что не находится в списке.
-i
только для безопасности.