Как удалить файлы JPG, но только в том случае, если соответствующий файл RAW существует?

#bash #file-extension

Вопрос:

В терминале debian я пытаюсь удалить все .jpg папки и подпапки, если .cr2 существует в одной папке.

Предполагается, что у них одно и то же имя. 123.jpg 123.cr2

Я знаю, как удалить весь файл .jpg с помощью команды «Найти».

 find {PATH} -type f -name '*.jpg' -delete
 

но как я могу добавить условие (если .cr2 существует)

Я нашел эту тему 10 лет, но она предназначена для Windows и python

Комментарии:

1. Примечательно, что я не смог найти дубликат для этого, хотя это похоже на часто задаваемые вопросы. Спасибо за заполнение пробела в базе знаний!

Ответ №1:

Вы можете попробовать что-то вроде:

 shopt -s globstar
for i in /path/**.jpg
do
RAW=${i%.jpg}.cr2
if [ -f "$RAW" ]
then rm "$i"
fi
done
 

Если вы поклонник oneliners, вы можете преобразовать скрипт во что-то вроде:

 shopt -s globstar; for i in /path/**.jpg; do [ -f "${i%.jpg}.cr2" ] amp;amp; rm "$i"; done
 

Комментарии:

1. Глобус ** поддерживается большинством современных оболочек, но это не функция POSIX. Некоторые сайты отключают его по умолчанию, поэтому вам придется включить его отдельно. В Баш, shopt -s globstar

2. Просто к вашему сведению, вы могли бы заменить свою 3-строчку if-then-fi на [ -f "$RAW" ] amp;amp; rm "$i"

3. Круто — у тебя уже есть мой голос👍

4. @MarkSetchell, спасибо. Вероятно, код можно сократить еще больше: [ -f "${i%.jpg}.cr2" ] amp;amp; rm "$i"

5. Действительно, и если вы тоже поставите точки с запятой перед do и done , это может быть однострочный😉