Как сравнить список файлов с разными расширениями и удалить лишние файлы?

У меня есть 2 папки, одна из которых содержит файлы изображений, а вторая содержит текстовые файлы, каждый текстовый файл имеет то же имя, что и файл изображения, и содержит информацию об изображении. Для изображений, у которых нет текстового файла (в этом примере: 4.jpg, 5.jpg), я нашел способ определения различных файлов, но не могу их удалить.

diff <(ls -1 ./Images | sed s/.jpg//g) <( ls -1 ./Labels | sed s/.txt//g)
4
задан 5 August 2019 в 13:35

3 ответа

Вот маленький сценарий удара, который может помочь Вам решить эту задачу:

#!/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
7
ответ дан 23 November 2019 в 11:38

Я думаю, что сделал бы это как это:

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

Это покажет, какие команды будут выполняться.

5
ответ дан 23 November 2019 в 11:38
cd /path/to/Images
LIST=$(find /path/to/Labels -iname *.txt -printf "%f|" | sed 's/.txt/.jpg/g')
rm -i !($LIST)
  1. Генерирует список txt файлы.
  2. Изменяет их расширение jpg.
  3. Удаляет что-либо, что не находится в списке.

    • -i только для безопасности.
2
ответ дан 23 November 2019 в 11:38

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

Похожие вопросы: