Задача такая, есть множество файлов, и множество директорий modified:
/var/www/.../2019/modified/pict1_800x600.jpg
/var/www/.../2019/modified/pict1_1024x768.jpg
'...' - указано не просто так, путь не известен
нужно удалить эти файлы, если в папке /var/www/.../2019/ нет файла pict1_parent.jpg
Спасибо, красивое решение. Можно несколько уточнений?
1) "+" означает {1,}, но почему если заменить, то не работает?
2) почему если заменить ".*/modified/[^/]+\.jpg" на ".*/modified/[^/]+\.(jpg|webp)" то не работает?
for i in $(find /var/www -name "modified" -type d); do if [[ $(find "$i"/.. -name "pict1_parent.jpg" | wc -l) -eq 0 ]]; then rm -rf "$i"/pict1_*.jpg; fi; done
Почти.. нужно учесть, что файл pict, не один, т.е. их может быть 1..99999.
Названия файлов тоже отличаются, может быть не pict, а к примеру pictures.
В папке modified хранятся только jpg файлы, и все их нужно проверить.
Есть окончание типа _1024x768.jpg или _800x600.jpg от него нужно отталкиваться, т.е. для
pictures_1024x768.jpg нужно искать на уровень выше родителя pictures_parent.jpg
для
foto_800x600.jpg нужно искать foto_parent.jpg
и т.д.
Проще говоря, c помощью регулярного выражением находим имя - до знака "_", поднимаемся на уровень выше и ищем такое же имя до знака "_".