технически вы можете решить вашу проблему таким образом, независимо от того, используете ли вы командную строку или любой другой язык сценариев
первый поиск и отдельный список 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](https://i.stack.imgur.com/vZIWW.png)
теперь, когда наш вывод:
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