Удалить файл XML, который не имеет соответствующего файла JPG - PullRequest
0 голосов
/ 18 июня 2019

У меня есть папка, которая содержит изображения и файлы XML с одинаковыми именами

Так что пример будет

A.jpg A.xml
B.jpg B.xml
C.jpg C.xml

и т. Д.

Я хочу удалитьФайлы XML, для которых нет соответствующих файлов jpg

Все файлы находятся в одной папке.

ОС - Ubuntu 16.04 LTS

Ответы [ 3 ]

1 голос
/ 18 июня 2019

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

первый поиск и отдельный список xml файла и jpg

find -name \*.xml | sed 's/\.xml//g' > list-xml
find -name \*.jpg | sed 's/\.jpg//g' > list-jpg

нас не заботили расширения файлов: xml или jpg просто имена файлов

scond сортирует оба списка и уникальные их, те, которые являются 1 , являются одним файлом, у которого нет соответствующих xml или jpg

cat list-xml list-jpg | sort | uniq -c | grep 1

третий проверить вывод

, которое является именем файла без xml или jpg, и если это xml , мы должны удалить его


пример, даже если он рекурсивный

tree .
├── one
│   ├── A.jpg
│   ├── A.xml
│   ├── B.jpg
│   ├── B.xml
│   ├── C.jpg
│   ├── C.xml
│   └── D.xml      # this one is a single one
├── three
│   ├── A.jpg
│   ├── A.xml
│   ├── B.jpg
│   ├── B.xml
│   ├── C.jpg
│   └── C.xml
└── two
    ├── A.jpg
    ├── A.xml
    ├── B.jpg
    ├── B.xml
    ├── C.jpg
    └── C.xml

enter image description here

теперь, когда наш вывод:

cat list-xml list-jpg | sort | uniq -c | grep 1
      1 ./one/D

мы знаем, что мы должны удалить этот файл , если это xml . Так просто попробуйте

rm -f ./one/D.xml

как насчет нескольких файлов?

Ну. Сохранить список вывода; добавьте xml в конце всех и затем удалите все файлы в списке. Например, если вы сохранили вывод в файле с именем result

perl -lne 's/ +\d//g && print "$_.xml"' result

, что дает вам:

./one/D.xml

вы можете использовать perl , чтобы удалить их напрямую, или лучше сохранить их, чтобы иметь список того, что вы хотите / хотите удалить.


Также вы можете решить это очень просто, но это немного сложно. Тщательно продумайте свою потребность:

Я хочу удалить файлы XML, для которых нет соответствующих файлов jpg

Так что вам нужно удалить xml файлы, у нас нет файла с тем же именем, но в формате jpg, верно?

первый список всех xml файлов

find -name \*.xml > all-xml

проверить, существует ли файл, но в формате jpg?

$ perl -lne 's/\.xml$/.jpg/g && print -e  $_' all-xml 
1
1
1
1
1
         # this file does not exist
1
1
1
1
$ # it means that xml file exists but it has no corresponding jpg file
$ # we can see name of this file
$ # here with perl we see if it exists -e $_ do nothing
$ # otherwise print the file
$ perl -lne 's/\.xml$/.jpg/g && -e  $_ || s/\.jpg/\.xml/ && print ' all-xml
./one/D.xml

этот файл, которому не соответствует jpg, является:

./one/D.xml

И вы можете сделать это в одну строку следующим образом:

perl -MFile::Find -le 'find(sub{ ($_=$File::Find::name) && push(@xml,$_) }, "." ); END{ s/xml$/jpg/ && print -e $_ || (s/jpg$/xml/) &&  print $_ for @xml}'
1
./all-xml           # ./all.jpg does not exist, yes it is our file
1
1
1
1
1
1
1
./one/D.xml         # ./one/D.jpg does not exist so this file should be deleted 
1
1
1
1
1
1 голос
/ 18 июня 2019

С bash и его Расширение параметра :

for file in *.xml; do
  jpg="${file%.xml*}.jpg"      # if $file contains A.xml, $jpg is set with A.jpg 
  if [[ ! -e "$jpg" ]]; then   # true if $jpg does not exists
    echo rm -v "$file"
  fi
done

Если вывод выглядит нормально, удалите echo.

0 голосов
/ 18 июня 2019

этот код Python может помочь, вам просто нужно отредактировать переменную пути.

import os
from tqdm import tqdm

path = 'your path'

files = os.listdir(path)

for file in tqdm(files):
    filename, filetype = file.split('.')
    if filetype == 'xml':
        continue

    imgfile = os.path.join(path, file)
    xmlfile = os.path.join(path, filename + '.xml')
    if not os.path.exists(xmlfile):
        print('{} deleted.'.format(imgfile))
        os.remove(imgfile)
...